42

私は、Pythonのテンソルフロー変数に新しい値を代入しようとしています。私が手TensorFlow変数に値を割り当てる方法は?

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 

だから、値が変更されていないです。私は何が欠けていますか?

答えて

72

声明x.assign(1)は、実際にxに値1を割り当てるのではなく、あなたが変数を更新するために、明示的に実行に持って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を返す。)

+0

ありがとうございます! assign_op.run()にエラーがあります。AttributeError: 'Tensor'オブジェクトに 'run'属性がありません。 しかし、sess.run(assign_op)は正常に動作します。 – abora

+0

この例では、 'assign'演算/変更可能なテンソルが上書きされる前にメモリに保存された'変数 '' x'のデータか、更新された値を格納する新しいテンソルが作成されていますか? – dannygoldstein

+3

'assign()'の現在の実装は、既存の値を上書きします。 – mrry

-4

より簡単なアプローチがあります:あなたがちょうどそれらにあなたがプレースホルダでそれを行うのと同じ方法で値を供給することにより、変数/定数に値を割り当てることができ、すべての

x = tf.Variable(0) 
x = x + 1 
print x.eval() 
+2

o.p. tf.assign'の使用法を調べていました。 – vega

6

まず。だから、これを行うのは完全に合法である:

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)を実行する。また、それはあなたがyour_tensor.assign()を使用している場合、その後、tf.global_variables_initializerが割り当て操作があなたのためにそれをしないので、明示的に呼び出される必要がないことに留意しなければならない

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) 
+1

'feed_dict 'を介して値を渡しても、その値は変数に代入されません。 –

2

:例として割り当てる使用しますが、このような何かをしますバックグラウンドで

例:

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がオンに実行された変数を初期化します。

2

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. 
関連する問題