3

入力として 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 回適用する必要があることです。

  1. 最初に損失を計算し、それが 0 より大きいかどうかを確認します

  2. 次にオプティマイザーを実行します。これは、問題が発生したときです。前に述べたように、ドロップアウトを使用しているため、入力に対するモデルの結果が異なるため、ステップ 1 で決定された損失が 0 より大きい場合でも、新しい損失が 0 になることがあります。

私も使ってみましtf.py_funcたが行き詰まりました。

4

1 に答える 1