自分のニューラルネットワーク出力に基づいてリストを作成し、Tensorflowで損失機能として使用しようとしています。リストを作成して損失機能で使用するTensorflow
results
は、ニューラルネットワークによって出力されるサイズ[1, batch_size]
のリストであるとします。このリストの最初の値が、valid_range
というプレースホルダとして渡された特定の範囲にあるかどうかを確認し、リストに1
が追加されているかどうかを確認します。そうでない場合は、-1
を追加します。目標は、範囲内のネットワークのすべての予測を行うことです。正しい予測はすべて1
のテンソルです。correct_predictions
と呼びます。
values_list = []
for j in range(batch_size):
a = results[0, j] >= valid_range[0]
b = result[0, j] <= valid_range[1]
c = tf.logical_and(a, b)
if (c == 1):
values_list.append(1)
else:
values_list.append(-1.)
values_list_tensor = tf.convert_to_tensor(values_list)
correct_predictions = tf.ones([batch_size, ], tf.float32)
は今、私は私が指定した範囲になるように、すべての予測を強制することができるように、自分のネットワーク内で損失関数としてこれを使用したいです。私はこのように訓練してみてください。
loss = tf.reduce_mean(tf.squared_difference(values_list_tensor, correct_predictions))
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate)
gradients, variables = zip(*optimizer.compute_gradients(loss))
gradients, _ = tf.clip_by_global_norm(gradients, gradient_clip_threshold)
optimize = optimizer.apply_gradients(zip(gradients, variables))
これは、しかし、問題があり、最後のoptimize
行にエラーがスローされます、と言って:
ValueError: No gradients provided for any variable: ['<tensorflow.python.training.optimizer._RefVariableProcessor object at 0x7f0245d4afd0>',
'<tensorflow.python.training.optimizer._RefVariableProcessor object at 0x7f0245d66050>'
...
私はTensorboardでこれをデバッグしようとした、およびI私が作成しているリストがグラフに表示されないことに注意してください。基本的には、損失機能の一部であるx
はネットワーク自体の一部ではありません。ニューラルネットワークの予測に基づいてリストを正確に作成し、それをTensorflowの損失関数に使用してネットワークをトレーニングする方法がありますか?
私は数日間この状態で立ち往生しています。
編集: コメントに示唆されたことに続いて、私はvalues_list_tensor
の前にあったバイナリベクトルで12の損失関数を乗算することに決めました。バイナリベクトルは今や1
と-1
の代わりに1
と0
の値を持ちます。このようにして予測が範囲内にある場合、損失は0であり、そうでない場合は通常の損失である。私はテンソルの値を見ることができないので、これが正しいかどうかはわかりません。しかし、私は最終的な損失を見ることができ、それは常に0なので、ここで何かが間違っています。乗算が正しく行われていて、values_list_tensor
が正確に計算されているかどうかはわかりませんか?誰かが助けて、何が間違っているかも教えてもらえますか?コメントで質問に答えるために
loss = tf.reduce_mean(tf.nn.l2_loss(tf.matmul(tf.transpose(tf.expand_dims(values_list_tensor, 1)), tf.expand_dims(result[0, :], 1))))
おかげ
(**それは**非微分であると離れて、有効なTFコードされていないから、この損失は、勾配ベースの方法のためには意味がありません:たとえば、ここでは他のどこでも
[-1, 1]
で0
を返し、x
機能がありますより正確には:それは微分可能ですが、派生物はどこでも0なので、学習はできません)。あなたが探しているのは、 "切り捨てられた"センターを持つL2損失ラインの中で、範囲内で0ペナルティを、外側では12ペナルティを与えるものです。 ifsではなく、方程式として表現してください。 – lejlotうーん、興味深い。私はこれを報酬ベースの方法を学習する強化の一種として実行しています。報酬が範囲内にある場合は+1、範囲外の場合は-1です。私はそれを使ってLSTMを更新します。私はL2の損失に関してあなたが示唆したものを見ていきます。あなたがこれを行う方法についてのコードを持っていて、それを回答として投稿して動作させることができれば、それを正しくマークすることができます。 – hockeybro
フォローアップとして、私はネットワークのLSTM部分だけを更新したい、この後にいくつかのFC層があり、更新したくない。私はまだコードを理解することができませんでした。範囲を 'tf.nn.l2_loss'関数の一部としてどのように考えていますか?私自身の12の損失方程式を作成する必要がありますか? – hockeybro