2016-09-20 63 views
0

我有一個TensorFlow問題,當我使用輸入丟失時,LSTM的性能急劇下降(從70%降至< 10%)。測試失敗導致LSTM性能故障

據我所知,我應該將input_keep_probability設置爲(例如)在訓練期間爲0.5,然後在測試期間設爲1。這非常合理,但我無法按預期工作。如果我在測試過程中設置了退出,就像在訓練過程中一樣,我的性能得到了提高(這在下例中不是這種情況,但這需要更少的代碼,點數也是一樣的)。

The accuracy and cost of 3 runs

的 '最佳' 路線是沒有下降現象,最壞的行是[keep_prob @火車:0.5,keep_prob @測試:1]和中心線爲[keep_prob @火車:0.5,keep_prob @測試:0.5]。這些都是測試裝置的成本和準確性。他們在火車上的表現如預期一樣。

下面是我認爲很重要的代碼。可悲的是,由於其敏感性,我無法發佈完整的代碼或數據樣本,但請評論是否需要更多信息。

lstm_size = 512 
numLayers = 4 
numSteps = 15 

lstm_cell = tf.nn.rnn_cell.LSTMCell(lstm_size, state_is_tuple=True, forget_bias=1) 
lstm_cell = tf.nn.rnn_cell.DropoutWrapper(lstm_cell, input_keep_prob=input_keep_prob) 
cell = tf.nn.rnn_cell.MultiRNNCell([lstm_cell] * numLayers, state_is_tuple=True) 

_inputs = [tf.squeeze(s, [1]) for s in tf.split(1, numSteps, input_data)] 
(outputs, state) = rnn.rnn(cell, _inputs, dtype=tf.float32) 
outputs = tf.pack(outputs) 

#transpose so I can put all timesteps through the softmax at once 
outputsTranspose = tf.reshape(outputs, [-1, lstm_size]) 

softmax_w = tf.get_variable("softmax_w", [lstm_size, nof_classes])       
softmax_b = tf.get_variable("softmax_b", [nof_classes]) 

logits = tf.matmul(outputsTranspose, softmax_w) + softmax_b 

loss = tf.nn.sparse_softmax_cross_entropy_with_logits(logits, targets) 
cost = tf.reduce_mean(loss) 

targetPrediction = tf.argmax(logits, 1) 
accuracy = tf.reduce_mean(tf.cast(tf.equal(targetPrediction, targets), "float")) 

"""Optimizer""" 
with tf.name_scope("Optimizer") as scope: 
    tvars = tf.trainable_variables() 

    #We clip the gradients to prevent explosion 
    grads, _ = tf.clip_by_global_norm(tf.gradients(cost, tvars),maxGradNorm) 
    optimizer = tf.train.AdamOptimizer(learning_rate) 
    gradients = zip(grads, tvars) 
    train_op = optimizer.apply_gradients(gradients) 


with tf.Session() as sess: 
    sess.run(init_op); 

    for i in range(nofBatches * nofEpochs): 
     example_batch, label_batch = sess.run(readTrainDataOp) 

     result = sess.run([train_op, accuracy, trainSummaries], feed_dict = {input_data: example_batch, targets: label_batch, input_keep_prob:trainInputKeepProbability, batch_size_ph:batch_size}) 
     #logging 

     if i % 50 == 0: 
      runTestSet() 
      #relevant part of runTestSet(): 
      #result = sess.run([cost, accuracy], feed_dict = {input_data: testData, targets: testLabels, input_keep_prob:testInputKeepProbability, batch_size_ph:testBatchSize}) 
      #logging 

我在做什麼錯誤,造成這種意想不到的行爲?

編輯:這是輸入樣本的樣子的圖像請參閱下一個鏈接。

該問題也只存在於1層。編輯:I made an example that reproduces the problem。只需運行python腳本,將test_samples.npy的路徑作爲第一個參數,並將檢查點的路徑作爲第二個參數。

+0

您可以用少量的重現該問題以及OM我LSTM工作代碼和一些可以共享的測試數據?這將有助於我們更有效地調試問題。 –

+0

這很短 – Julius

+0

對不起,響應緩慢,我錯誤地禁用了我的通知。我添加了對該問題的輸入圖像。我還會寫一些代碼來讀取一個檢查點,並在幾個測試樣本上運行帶有或不帶缺失的測試。 –

回答

0

嘗試input_keep_prob = output_keep_prob = 0.7訓練 和1.0保持概率測試

0.5保持概率並不要麼

+1

請編輯更多信息。僅限代碼和「嘗試這個」的答案是不鼓勵的,因爲它們不包含可搜索的內容,也不解釋爲什麼有人應該「嘗試這個」。 – abarisone

+0

雖然此代碼片段可能會解決問題,但[包括解釋](http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)確實有助於提高帖子的質量。請記住,您將來會爲讀者回答問題,而這些人可能不知道您的代碼建議的原因。 –

+0

對不起,響應緩慢,我錯誤地禁用了我的通知。它現在正在運行您所建議的參數,並且它再次執行相同的操作。到目前爲止,我的最佳結果實際上是第一層的input_keep_prob = 0.8,接下來的3層爲0.5,測試時爲[0.8,1,1,1](精度爲80%)。如果我使用所有keep_probs運行測試集(權重相同),結果會降至10-15%左右。 –