2017-06-04 9 views
1

の割り当て操作がの後にネットワークの順方向パスの部分で使用されている場合、TensorFlowのバックプロパゲーションはその重みの勾配を決定する際の割り当て操作を考慮していますか?たとえば、私が持っている場合、TensorFlow - 処理後の勾配を割り当てるops?

weights = tf.Variable(...) 
bias = tf.Variable(...) 
output = tf.tanh(tf.matmul(weights, input) + bias) 
weight_assign_op = weights.assign(weights + 1.0) 
with tf.control_dependencies(weight_assign_op): 
    output2 = tf.identity(output) 

出力が計算され、次に重みが変更されます。変数を更新するために出力を使用して損失と勾配を計算する場合、勾配はweightsへの変更を考慮して作成されますか?つまり、weightsの勾配はold_weights + 1.0の正しい勾配ですか、またはの勾配になりますか?新しいweightsに適用すると必ずしも勾配降下の「正しい」勾配ではありませんか?

答えて

0

私は実験的にテストしました。勾配計算に割り当て操作を考慮します。私は以下のコードを使ってテストしました。それを実行すると、正のグラディエントになります。重み割り当てopラインとコントロール依存ラインをコメントアウトすると、負の勾配になります。これは、元の開始値の重みが0.0であるか、または2.0の割り当て後に更新された重みの傾きが考慮されるためです。

import tensorflow as tf 

data = [[1.0], [2.0], [3.0]] 
labels = [[1.0], [2.1], [2.9]] 

input_data = tf.placeholder(dtype=tf.float32, shape=[3, 1]) 
input_labels = tf.placeholder(dtype=tf.float32, shape=[3, 1]) 
weights = tf.Variable(tf.constant([0.0])) 
bias = tf.Variable(tf.constant([0.0])) 
output = (weights * input_data) + bias 
weight_assign_op = weights.assign(tf.constant([2.0])) 
with tf.control_dependencies([weight_assign_op]): 
    output = tf.identity(output) 
loss = tf.reduce_sum(tf.norm(output - input_labels)) 
weight_gradient = tf.gradients(loss, weights) 
initialize_op = tf.global_variables_initializer() 

session = tf.Session() 
session.run([initialize_op]) 
weight_gradient_value = session.run([weight_gradient], feed_dict={input_data: data, input_labels: labels}) 
print(weight_gradient_value) 
関連する問題