2017-04-06 20 views
2
使用受训简单的前馈神经网络预测新的数据

原谅我,如果这听起来像一个愚蠢的问题。假设我有一个训练有形状[m,n]的数据的神经网络,我如何用形状数据测试训练网络[1,3]如何tensorflow

这里是我目前拥有的代码:

n_hidden_1 = 1024 
n_hidden_2 = 1024 
n = len(test_data[0]) - 1 
m = len(test_data) 

alpha = 0.005 
training_epoch = 1000 
display_epoch = 100 

train_X = np.array([i[:-1:] for i in test_data]).astype('float32') 
train_X = normalize_data(train_X) 
train_Y = np.array([i[-1::] for i in test_data]).astype('float32') 
train_Y = normalize_data(train_Y) 

X = tf.placeholder(dtype=np.float32, shape=[m, n]) 
Y = tf.placeholder(dtype=np.float32, shape=[m, 1]) 

weights = { 
    'h1': tf.Variable(tf.random_normal([n, n_hidden_1])), 
    'h2': tf.Variable(tf.random_normal([n_hidden_1, n_hidden_2])), 
    'out': tf.Variable(tf.random_normal([n_hidden_2, 1])) 
} 
biases = { 
    'b1': tf.Variable(tf.random_normal([n_hidden_1])), 
    'b2': tf.Variable(tf.random_normal([n_hidden_2])), 
    'out': tf.Variable(tf.random_normal([1])), 
} 

layer_1 = tf.add(tf.matmul(X, weights['h1']), biases['b1']) 
layer_1 = tf.nn.sigmoid(layer_1) 
layer_2 = tf.add(tf.matmul(layer_1, weights['h2']), biases['b2']) 
layer_2 = tf.nn.sigmoid(layer_2) 

activation = tf.matmul(layer_2, weights['out']) + biases['out'] 
cost = tf.reduce_sum(tf.square(activation - Y))/(2 * m) 
optimizer = tf.train.GradientDescentOptimizer(alpha).minimize(cost) 

with tf.Session() as sess: 
    sess.run(tf.global_variables_initializer()) 
    for epoch in range(training_epoch): 
     sess.run([optimizer, cost], feed_dict={X: train_X, Y: train_Y}) 
     cost_ = sess.run(cost, feed_dict={X: train_X, Y: train_Y}) 
     if epoch % display_epoch == 0: 
      print('Epoch:', epoch, 'Cost:', cost_) 

如何测试一个新的数据?对于回归我知道我可以使用类似这样的数据[0.4, 0.5, 0.1]

predict_x = np.array([0.4, 0.5, 0.1], dtype=np.float32).reshape([1, 3]) 
predict_x = (predict_x - mean)/std 
predict_y = tf.add(tf.matmul(predict_x, W), b) 
result = sess.run(predict_y).flatten()[0] 

我如何做同样的神经网络?

+0

什么尺寸'[M,N]'立场?样本数量和特征数量是多少? – kaufmanu

+0

@kaufmanu yup 720 3 – monoshiro

回答

0

如果使用

X = tf.placeholder(dtype=np.float32, shape=[None, n]) 
Y = tf.placeholder(dtype=np.float32, shape=[None, 1]) 

那些两个占位符的第一尺寸将具有可变大小,即在训练时间也可以是不同的比在试验时间(例如720)(例如,1)。这通常被称为“可变批量”,因为在培训和测试过程中批量不同的情况很常见。

在此行中:

cost = tf.reduce_sum(tf.square(activation - Y))/(2 * m) 

你正在使用的m现在是可变的。使可变批量这条线的工作(如m是图的执行之前,现在未知的),你应该这样做:

m = tf.shape(X)[0] 
cost = tf.reduce_sum(tf.square(activation - Y))/(tf.multiply(m, 2)) 

tf.shape评估的X动态形状,即它在运行时的形状。