私はPythonでテンソルフロー変数に新しい値を割り当てようとしています。
import tensorflow as tf
import numpy as np
x = tf.Variable(0)
init = tf.initialize_all_variables()
sess = tf.InteractiveSession()
sess.run(init)
print(x.eval())
x.assign(1)
print(x.eval())
しかし、私が得る出力は
0
0
したがって、値は変更されていません。私は何が欠けていますか?
ステートメント x.assign(1)
は、実際に値1
をx
に割り当てませんが、代わりに明示的にrunする必要がある tf.Operation
を作成します変数を更新します。* Operation.run()
または Session.run()
を呼び出して、操作を実行できます。
assign_op = x.assign(1)
sess.run(assign_op) # or `assign_op.op.run()`
print(x.eval())
# ==> 1
(*実際には、変数の更新された値に対応するtf.Tensor
を返し、割り当ての連鎖を容易にします。)
グラフに操作を追加せずに、新しい値をtf.Variable
に割り当てることもできます: tf.Variable.load(value, session)
。この関数は、グラフの外部から値を割り当てるときにプレースホルダーを追加する手間を省くことができ、グラフが完成した場合に役立ちます。
import tensorflow as tf
x = tf.Variable(0)
sess = tf.Session()
sess.run(tf.global_variables_initializer())
print(sess.run(x)) # Prints 0.
x.load(1, sess)
print(sess.run(x)) # Prints 1.
更新:これは、熱心な実行がデフォルトであり、グラフが ユーザー向けAPIで公開されなくなった であるため、TF2で廃止されました。
まず、プレースホルダーを使用するのと同じ方法で値を変数/定数に入力するだけで、変数/定数に値を割り当てることができます。したがって、これは完全に合法です:
import tensorflow as tf
x = tf.Variable(0)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print sess.run(x, feed_dict={x: 3})
tf.assign() 演算子との混乱について。 TFでは、セッション内で実行する前に何も実行されません。そのため、常に次のような処理を行う必要があります。op_name = tf.some_function_that_create_op(params)
、そしてセッション内でsess.run(op_name)
を実行します。 assignを例として使用すると、次のようになります。
import tensorflow as tf
x = tf.Variable(0)
y = tf.assign(x, 1)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print sess.run(x)
print sess.run(y)
print sess.run(x)
また、your_tensor.assign()
を使用している場合は、割り当て操作がバックグラウンドで行うため、tf.global_variables_initializer
を明示的に呼び出す必要はありません。
例:
In [212]: w = tf.Variable(12)
In [213]: w_new = w.assign(34)
In [214]: with tf.Session() as sess:
...: sess.run(w_new)
...: print(w_new.eval())
# output
34
ただし、これはすべての変数を初期化するわけではありませんが、assign
が実行された変数のみを初期化します。
Tensorflowの最新の実行モードを使用します。
import tensorflow as tf
tf.enable_eager_execution()
my_int_variable = tf.get_variable("my_int_variable", [1, 2, 3])
print(my_int_variable)
完全な作業例は次のとおりです。
import numpy as np
import tensorflow as tf
w= tf.Variable(0, dtype=tf.float32) #good practice to set the type of the variable
cost = 10 + 5*w + w*w
train = tf.train.GradientDescentOptimizer(0.01).minimize(cost)
init = tf.global_variables_initializer()
session = tf.Session()
session.run(init)
print(session.run(w))
session.run(train)
print(session.run(w)) # runs one step of gradient descent
for i in range(10000):
session.run(train)
print(session.run(w))
出力は次のようになります。
0.0
-0.049999997
-2.499994
これは、定義されたとおり、変数の最初の段階では変数が0であったことを意味し、勾配の1ステップだけで変数が-0.049999997になり、さらに10.000ステップ後に-2.499994に達します(コスト関数に基づく)。
注:元々は対話型セッションを使用していました。対話型セッションは、同じスクリプトで複数の異なるセッションを実行する必要がある場合に役立ちます。ただし、簡単にするために、非対話型セッションを使用しました。
だから、セッションを実行する前に値を割り当てる必要があるという別のケースがあったので、これが最も簡単な方法でした:
other_variable = tf.get_variable("other_variable", dtype=tf.int32,
initializer=tf.constant([23, 42]))
ここでは、変数を作成すると同時に値を割り当てています
同様の質問に答えました here 。私はいつも同じ問題を引き起こす多くの場所を見ました。基本的に、重みに値を割り当てたくありませんでしたが、単純に重みを変更しました。上記の答えの短いバージョンは次のとおりです。
tf.keras.backend.set_value(tf_var, numpy_weights)