2017-10-17 72 views
1

我正在嘗試在TensorFlow中實現輟學,以獲得簡單的3層神經網絡進行分類並遇到問題。更具體地說,我試圖在訓練vs.測試時應用不同的丟失參數pkeep值。TensorFlow丟失:如何應用不同的值來訓練VS測試?

我採用的方法如下:

1)DEF create_placeholders(n_x,n_y):

X = tf.placeholder("float", [n_x, None]) 
Y = tf.placeholder("float", [n_y, None]) 
pkeep = tf.placeholder(tf.float32) 
return X,Y,pkeep 

2)在功能forward_propagation(X,參數,pkeep),I執行以下內容:

Z1 = tf.add(tf.matmul(W1, X), b1) 
A1 = tf.nn.relu(Z1) 
A1d = tf.nn.dropout(A1, pkeep) 
Z2 = tf.add(tf.matmul(W2, A1d),b2) 
A2 = tf.nn.relu(Z2) 
A2d = tf.nn.dropout(A2, pkeep) 
Z3 = tf.add(tf.matmul(W3, A2d),b3) 

return Z3 

3)以後,當tensorflow會話被調用(在爲清楚起見省略代碼線)之間:

X, Y, pkeep = create_placeholders(n_x, n_y) 

Z3 = forward_propagation(X, parameters, pkeep) 

sess.run([optimizer,cost], feed_dict={X:minibatch_X, Y:minibatch_Y, pkeep: 0.75}) 

上面的代碼運行時不會出現任何錯誤。但是,我認爲上述設置將pkeep值設置爲0.75,以進行培訓和測試。小火車只在列車數據集上完成,但我沒有在其他地方設置pkeep值。

我想設置培訓和pkeep = 1.0進行測試。

4)它,當我做這樣的事情給出一個錯誤:

x_train_eval = Z3.eval(feed_dict={X: X_train, Y: Y_train, pkeep: 0.75}) 

x_test_eval = Z3.eval(feed_dict={X: X_test, Y: Y_test, pkeep: 1.0}) 

我得到的錯誤信息是:

InvalidArgumentError (see above for traceback): You must feed a value for placeholder tensor 'Placeholder_2' with dtype float 
    [[Node: Placeholder_2 = Placeholder[dtype=DT_FLOAT, shape=[], _device="/job:localhost/replica:0/task:0/cpu:0"]()]] 

什麼是通過不同pkeep的最佳方式訓練和測試的價值?你的意見將不勝感激。

回答

0

假設你有定義爲test_op測試某些操作(例如,一些評估對輸入數據和標籤的準確性),你可以做這樣的事情:

for i in range(num_iters): 
    # Run your training process. 
    _, loss = sess.run([optimizer, cost], 
         feed_dict={X:minibatch_X, Y:minibatch_Y, pkeep: 0.75}) 
# Test the model after training 
test_accuracy = sess.run(test_op, 
         feed_dict={X:test_X, Y:test_Y, pkeep: 1.0}) 

基本上你是不是測試模型,當你正在訓練它時,你可以在準備測試時調用你的test_op,給它提供像pkeep這樣的不同超參數。在培訓期間定期對模型進行驗證的過程也是一樣的:每隔一段時間對外延數據集運行評估操作,通過與培訓期間使用的參數不同的超參數,然後您可以保存配置或儘早停止根據您的驗證準確性。

test_op可能返回類似的預測準確度的分類:

correct = tf.equal(tf.argmax(y, 1), tf.argmax(predict, 1)) 
test_op = tf.reduce_mean(tf.cast(correct, tf.float32)) 

其中y是你的目標標籤和predict是你的預測運算的名稱。

+0

謝謝Engineero。這非常有幫助。我得到它的工作。 – BrightOrange

+0

@BrightOrange太棒了!如果有任何答案有幫助,請將其標記爲正確,以便將來有同樣問題的人知道您的工作是什麼。 – Engineero

+0

如果將其標記爲「正確」,意味着將「答案標爲有用」,我被告知我需要至少15個聲望點才能做到這一點。一旦我累積了15分,我就會回來並且這樣做。我剛剛加入昨天=)非常感謝。 – BrightOrange

0

在神經網絡中,您正向傳播以計算logits(每個標籤的概率),並將其與實際值進行比較以獲取錯誤。

訓練涉及通過向後傳播即最小化錯誤,即找出關於每個權重的誤差導數,然後從該權重值中減去該值。

當您將訓練和評估模型所需的操作分開時,應用不同的失落參數會更容易。

培訓只是儘量減少損失:

def loss(logits, labels): 
    ''' 
    Calculate cross entropy loss 
    ''' 
    cross_entropy = tf.nn.softmax_cross_entropy_with_logits(
     labels=labels, logits=logits) 
    return tf.reduce_mean(cross_entropy, name='loss_op') 


def train(loss, learning_rate): 
    ''' 
    Train model by optimizing gradient descent 
    ''' 
    optimizer = tf.train.AdamOptimizer(learning_rate) 
    train_op = optimizer.minimize(loss, name='train_op') 
    return train_op 

評估只是計算精度:

def accuracy(logits, labels): 
    ''' 
    Calculate accuracy of logits at predicting labels 
    ''' 
    correct_prediction = tf.equal(tf.argmax(logits, 1), tf.argmax(labels, 1)) 
    accuracy_op = tf.reduce_mean(tf.cast(correct_prediction, tf.float32), 
           name='accuracy_op') 
    return accuracy_op 

然後在你的Tensorflow會議,產生佔位符並添加必要的操作後圖表等只是將不同的keep_prob_pl值輸入運行方法:

# Train model 
sess.run(train_op, feed_dict={x_pl: x_train, y_train: y, keep_prob_pl: 0.75}}) 

# Evaluate test data 
batch_size = 100 
epoch = data.num_examples // batch_size 
acc = 0.0 
for i in range(epoch): 
    batch_x, batch_y = data.next_batch(batch_size) 
    feed_dict = {x_pl: batch_x, y_pl: batch_y, keep_prob_pl: 1} 
    acc += sess.run(accuracy_op, feed_dict=feed_dict) 

print(("Epoch Accuracy: {:.4f}").format(acc/epoch)) 
+0

謝謝你。您的詳細答案幫助我瞭解了下面的Engineero的評論。我能夠得到它的工作=) – BrightOrange

+0

不客氣:) – Soph