파이썬에서 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
따라서 값은 변경되지 않았습니다. 내가 무엇을 놓치고 있습니까?
답변
TF1에서 문은 x.assign(1)
실제로 값을 할당하지 않습니다 1
에를 x
, 오히려를 생성 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
할당을 더 쉽게 연결할 수 있도록 업데이트 된 변수 값에 해당 하는를 반환 합니다.)
그러나 TF2에서는 x.assign(1)
이제 값을 열심히 할당합니다.
x.assign(1)
print(x.numpy())
# ==> 1
답변
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.
업데이트 : eager 실행이 기본값이고 그래프가 더 이상 사용자 용 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
실행 된 변수 만 초기화합니다 .
답변
나는 여기서 비슷한 질문에 답했다 . 나는 항상 같은 문제를 일으키는 많은 곳을 살펴 보았다. 기본적으로 가중치에 값을 할당하고 싶지 않고 단순히 가중치를 변경합니다. 위 답변의 짧은 버전은 다음과 같습니다.
tf.keras.backend.set_value(tf_var, numpy_weights)
답변
다음은 완전한 작업 예입니다.
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이었고, 그래디언트 한 단계 만 수행하면 변수가 -0.049999997이되었고, 10.000 단계를 더 수행하면 -2.499994에 도달합니다 (비용 함수 기준).
참고 : 원래 대화 형 세션을 사용했습니다. 대화 형 세션은 동일한 스크립트에서 여러 세션을 실행해야 할 때 유용합니다. 그러나 단순성을 위해 비대화 형 세션을 사용했습니다.
답변
최신 Tensorflow eager 실행 모드를 사용하십시오.
import tensorflow as tf
tf.enable_eager_execution()
my_int_variable = tf.get_variable("my_int_variable", [1, 2, 3])
print(my_int_variable)