2017-12-21 10 views
0

以下に定義された独自のパラメータの更新を実装する際に問題があります。私はAdamOptimizerを使用するときに動作する畳み込みニューラルネットワークのためにこれを実行しようとしています。 重量およびバイアス値のヒストグラムを表示すると、損失が変化したにもかかわらず、繰り返しの変化は見られません。前もって感謝します。テンソルフローのカスタムパラメータの更新が機能しない

私は後でfeed_dict = minibatch

sess.run(gradient_upgrade(gradient, .001, 1), feed_dict = feed_dict) 

重みとバイアスにsess.runを呼び出して、それぞれ次の形式である

def gradient_upgrade(gradients, base_rate, rate_multiplier): 

    with tf.name_scope('gradient-update'): 
     for i in range(len(weights)): 
      weights[i].assign(tf.subtract(weights[i], tf.multiply(gradients[i], base_rate * rate_multiplier))) 
      biases[i].assign(tf.subtract(biases[i], tf.multiply(gradients[len(weights)+i], base_rate * rate_multiplier))) 

    return weights, biases 

gradient = tf.gradients(cost, [*weights, *biases]) 

tf.Variable(tf.truncated_normal(shape, stddev=0.05)) 
tf.Variable(tf.constant(0.05, shape=[length])) 
+0

だけで、それは無用であるworking' 'ではないことを言って:

擬似コードは次のようになります。あなたの質問を編集して_うまくいかないことを説明してください。あなたは何を期待していますか?それは現在何をしていますか?エラーは何ですか?詳細の不足のために投票を閉じる –

+0

うまくいけば、これでもう少し明確になるはずです@MattClark –

答えて

0

何が起こっているように見えることはあなたの割り当てということです操作は実行されません。お電話

sess.run(gradient_upgrade(gradient, .001, 1), feed_dict = feed_dict) 

gradient_updateの呼び出しは、単にそれがそれらを実行しませんassign操作を作成します。 gradient_updateの戻り値は重みとバイアスなので、sess.run()はこれらの変数を取得するためにグラフの部分を実行します。これは単に現在の値を読み取ることを意味します。

assign opsを実行するには、いくつかのオプションがあります。まず、作成した割り当て操作を保存し、明示的にsess.run()に渡すことができます。もう1つの方法はwith tf.control_dependencies()です。さらにexamplesを検索することもできますが、基本的に操作間の依存関係を追加することができます。つまり、[x、y、z、...]内のすべての演算を実行する必要がある操作[a、b、c、...]のいずれかを実行できるようになる前に、テンソルフローを "指示できます。それを使用して、Estimatorsによって作成されたupdate_opのようなものを作成することができます。この更新操作は、すべての割り当て操作に依存します。 sess.run(update_op)を実行するたびに、すべてのユーザがopsを割り当てて実行します。

# Create and put all of your assign ops in some list 
# assign_ops_list.append(weights[i].assign(....))) 
with tf.control_dependencies(assign_ops_list): 
    train_op = ... # Some operations that should trigger assignments 

sess.run(train_op) # all assign ops will now run. 
関連する問題