2017-12-22 20 views
1

私はこの論文をTensorflow CR-CNNに実装しています。 この論文で使用されている損失関数は、Tensorsと真のラベルの実行時の値に依存する項を持っています。私が知る限り、Tensorflowは静的な計算グラフを作成し、それをセッションで実行します。私は、実行時に両方が動的に変化するので、このペーパーで言及されている予測と損失の機能を実装するのは難しいと思っています。 私のコードでtf.cond()を使用しようとしましたが、その結果、グラデーションとして「なし」が発生しました。したがって、私のネットワークは全く訓練されていません。Tensorflowのペアワイズランキング損失関数

class_scores = tf.matmul(pooled, W_classes) 

n_correct = tf.Variable(0, trainable=True) 

for t in xrange(batch_size): 
    max_arg = tf.cast(tf.argmax(class_scores[t], 1), tf.int32) 
    #true_class = tf.constant(0) 
    true_class = tf.cast(tf.argmax(Y[t], 1), tf.int32) 

    pred_class = tf.Variable(0,trainable=True) 
    value = class_scores[t][max_arg] 
    tf.cond(value <= 0, lambda: tf.assign(pred_class, 0), lambda: tf.assign(pred_class, max_arg + 1)) 
    tf.cond(tf.equal(true_class, pred_class), lambda: tf.add(n_correct, 1), lambda: tf.add(n_correct, 0)) 

    #print(value) 

accuracy = tf.cast(n_correct, tf.float32)/tf.cast(batch_size, tf.float32) 

ここでは、正しい予測の数を数えて精度を計算しています。

にも損失関数のための同様のアプローチ:

gamma = tf.constant(2.0) 
m_plus = tf.constant(2.5) 
m_minus = tf.constant(0.5) 

batch_loss = tf.Variable(0.0, trainable=True) 


for t in xrange(batch_size): 
    max_arg = tf.cast(tf.argmax(class_scores[t], 1), tf.int32) 
    true_class = tf.cast(tf.argmax(Y[t], 1), tf.int32) 

    top2_val, top2_i = tf.nn.top_k(class_scores[t], 2, sorted=True) 

    pred_class = tf.Variable(0, trainable=True) 
    true_score = tf.Variable(0.0, trainable=True) 
    neg_score = tf.Variable(0.0, trainable=True) 

    value = class_scores[t][max_arg] 

    tf.cond(value <= 0, lambda: tf.assign(pred_class, 0), lambda: tf.assign(pred_class, max_arg + 1)) 

    tf.cond(tf.equal(true_class, 0), lambda: tf.assign(true_score, 0), lambda: tf.assign(true_score, class_scores[t][true_class-1])) 

    tf.cond(tf.equal(true_class, 0), lambda: tf.assign(neg_score, value), lambda: tf.cond(tf.equal(true_class, pred_class), 
       lambda: tf.assign(neg_score, top2_val[1]), lambda: tf.assign(neg_score, value))) 

    example_loss = tf.Variable(0.0, trainable=True) 

    tf.cond(tf.equal(true_class, 0), lambda: tf.assign(example_loss, tf.log(1 + tf.exp(tf.multiply(gamma, m_minus + neg_score)))), 
        lambda: tf.assign(example_loss, tf.log(1 + tf.exp(tf.multiply(gamma, m_plus - true_score))) + tf.log(1 + tf.exp(tf.multiply(gamma, m_minus + neg_score))))) 
    batch_loss = tf.add(batch_loss, example_loss) 

    #print(neg_score) 

batch_loss = batch_loss/batch_size 
train_step = tf.train.GradientDescentOptimizer(learning_rate=lambda_t).minimize(batch_loss) 

しかし、ネットワークが訓練された取得されていません。 誰でもテンソルフローでこれを行う方法を提案できますか?

答えて

1

このコードにはいくつか問題があり、そのまま動作しません。テンソルフローを使用して試してみることをお勧めします。そこには存在しない概念的な問題があります(たとえば、問題を解決するためにtf.condやtf.Variableは必要ありません)。

このコード例でtf.condを使用している問題は、tf.condが本質的に機能していることです(tf.condの戻り値を使用すると実行されるグラフにopsが追加されます)。ですから、あなたのコードは何らかの形で(おそらくtf.control_dependenciesを介して)tf.condを連鎖させて実行させる必要があります。

ただし、トレーニングの例ではtf.Variablesも使用します。 Tensorflowはtf.Variableへの代入をバックプロップすることはできません。その代わりに、tf.assignおよびfriendsへの呼び出しを変数の新しい値を返すように置き換え、Pythonから使用する必要があります。

関連する問題