入力として 3 つの画像を持つ畳み込みニューラル ネットワークがあります。
x_anchor = tf.placeholder('float', [None, 4900], name='x_anchor')
x_positive = tf.placeholder('float', [None, 4900], name='x_positive')
x_negative = tf.placeholder('float', [None, 4900], name='x_negative')
関数内でtrain、プレースホルダーに実際の画像をフィードします。
input1, input2, input3 = training.next_batch(start,end)
....some other operations...
loss_value = sess.run([cost], feed_dict={x_anchor:input1, x_positive:input2, x_negative:input3})
これら 3 つの入力に対してトリプレット損失関数を使用しています (これは実際には上記のコスト変数です)。
def triplet_loss(d_pos, d_neg):
margin = 0.2
loss = tf.reduce_mean(tf.maximum(0., margin + d_pos - d_neg))
return loss
損失をフィルタリングして、loss_value > 0 の画像のみがネットワークのトレーニングに使用されるようにするにはどうすればよいですか?
次のようなものを実装するにはどうすればよいですか:
if(loss_value for input1, input2, input3 > 0)
use inputs to train network
else
do nothing/try another input
私がこれまでに試したこと:
画像を 1 つずつ取得し (input1[0]、input2[0]、input3[0])、損失を計算し、損失が正の場合は勾配を計算 (および適用) します。しかし問題は、モデルでドロップアウトを使用していて、モデルを入力に 2 回適用する必要があることです。
最初に損失を計算し、それが 0 より大きいかどうかを確認します
次にオプティマイザーを実行します。これは、問題が発生したときです。前に述べたように、ドロップアウトを使用しているため、入力に対するモデルの結果が異なるため、ステップ 1 で決定された損失が 0 より大きい場合でも、新しい損失が 0 になることがあります。
私も使ってみましtf.py_funcたが行き詰まりました。