2017-04-06 23 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動態形狀,即它在運行時的形狀。