[python] TensorFlow 변수에 값을 할당하는 방법은 무엇입니까?

파이썬에서 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)