入力ドロップアウトを使用すると、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スクリプトを実行してください。
あなたは少量の問題を再現することはできますテストするためのキープPROBためinput_keep_prob = output_keep_prob = 0.7を試してみてくださいコードといくつかのテストデータを共有できますか?それは問題をより効果的にデバッグするのに役立ちます。 –
これはかなり短いです – Julius
遅い応答のため申し訳ありませんが、私は誤って自分の通知を無効にしました。質問の入力イメージを追加しました。また、チェックポイントを読み込み、いくつかのテストサンプルでドロップアウトの有無にかかわらずテストを実行するためのコードを書きます。 –