2016-09-20 6 views
0

入力ドロップアウトを使用すると、LSTMのパフォーマンスが大幅に低下するTensorFlowに問題があります(70%から<に10%)。テスト中にドロップアウトが発生してLSTMのパフォーマンスが低下する

私が理解しているように、input_keep_probabilityをトレーニング中に0.5に、テスト中に1に設定する必要があります。これは理にかなっていますが、意図したとおりに動作させることはできません。練習中と同じようにテスト中にドロップアウトを設定すると、パフォーマンスが向上します(これは以下の例では当てはまりませんが、コードが少なくて済み、ポイントも同じです)。

The accuracy and cost of 3 runs

'最良の' 行がないドロップアウトしない、最悪のラインは、[keep_probする@電車:0.5、keep_probする@テスト:1]である:0.5、keep_probする@試験と中心線は、[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。最初の引数としてtest_samples.npyへのパスと2番目の引数としてチェックポイントへのパスを持つpythonスクリプトを実行してください。

+0

あなたは少量の問題を再現することはできますテストするためのキープPROBためinput_keep_prob = output_keep_prob = 0.7を試してみてくださいコードといくつかのテストデータを共有できますか?それは問題をより効果的にデバッグするのに役立ちます。 –

+0

これはかなり短いです – Julius

+0

遅い応答のため申し訳ありませんが、私は誤って自分の通知を無効にしました。質問の入力イメージを追加しました。また、チェックポイントを読み込み、いくつかのテストサンプルでドロップアウトの有無にかかわらずテストを実行するためのコードを書きます。 –

答えて

0

トレーニング と1.0

0.5キープPROBは私LSTM OMうまく動作しないか

+1

詳細を編集してください。コード専用と「試してください」の回答は、検索可能なコンテンツが含まれていないため、推奨されません。なぜ誰かが「これを試してみる」べき理由を説明しません。 – abarisone

+0

このコードスニペットは問題を解決するかもしれませんが、[説明を含む](http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)は本当にあなたの投稿の質を向上させるのに役立ちます。将来読者の質問に答えていることを覚えておいてください。そうした人々はあなたのコード提案の理由を知らないかもしれません。 –

+0

遅い応答のため申し訳ありませんが、私は誤って通知を無効にしました。これはあなたが提案したパラメータで実行されており、同じことをやり直しています。これまでのところ、第1層ではinput_keep_prob = 0.8、次の3層では0.5、テスト(80%精度)では[0.8,1,1,1]です。私がすべてのkeep_probsを1.0で(同じ重みを使って)テストセットを実行すると、結果は10-15%程度に低下します。 –

関連する問題