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


79

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

따라서 값은 변경되지 않았습니다. 내가 무엇을 놓치고 있습니까?

답변:


124

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

감사! assign_op.run ()은 오류를 제공합니다 .AttributeError : 'Tensor'개체에 'run'속성이 없습니다. 그러나 sess.run (assign_op)은 완벽하게 잘 실행됩니다.
abora

이 예 Variable x에서 assign연산 / 가변 텐서가 실행 되기 전에 메모리에 저장된 데이터를 덮어 쓰거나 업데이트 된 값을 저장하는 새 텐서가 생성 되었습니까?
dannygoldstein 2016-06-22

3
의 현재 구현이 assign()기존 값 을 덮어 씁니다.
mrry

1
Variable그래프에서 추가 작업을 생성하지 않고에 새 값을 할당하는 방법이 있습니까? 각 변수에는 이미 할당 작업이 생성되어 있지만 기존 작업을 사용하는 대신 새 작업을 호출 my_var.assign()하거나 tf.assign()생성합니다.
나단

이것이 여기에 관련이 있다고 생각하지 않지만 assign수학 연산과 같은 텐서 매개 변수에 줄 수 있습니다 . 그리고 이런 식으로 할당 작업이 평가 될 때마다 업데이트되는 카운터를 만듭니다 op = t.assign(tf.add(t, 1))..
Eliel Van Hojman 2018

40

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에서는 더 이상 사용되지 않습니다. .


2
주의 사항 : 변수의 초기 값 모양과 모양이 다른 배열로로드 할 수 없습니다!
Rajarshee Mitra

1
Variable.load (tensorflow.python.ops.variables에서)는 더 이상 사용되지 않으며 향후 버전에서 제거 될 예정입니다. 업데이트 지침 : 2.X에서 동일한 동작을하는 Variable.assign 선호. 그래프에 연산을 추가하지 않고 Tensorflow 2.0에서 변수 값을 변경하는 방법을 잘 모르겠습니다
João Abrantes

15

우선 자리 표시 자와 같은 방식으로 값을 입력하여 변수 / 상수에 값을 할당 할 수 있습니다. 따라서 이것은 완벽하게 합법적입니다.

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)

@RobinDinse, 그렇습니다. 위의 예에서는 표준 출력으로 0,1,1을 얻습니다.
Rajarshee Mitra

4
를 통해 값을 제공하는 feed_dict것은 해당 값을 변수에 영구적으로 할당하는 것이 아니라 해당 특정 실행 호출에 대해서만 할당합니다.
Robin Dinse

@RobinDinse 어떻게 그 값을 영구적으로 할당 할 수 있습니까? 가능하다면 여기 내 질문을 참조하십시오. stackoverflow.com/questions/53141762/…
volperossa

3

또한, 당신이 사용하는 경우 주목해야 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실행 된 변수 만 초기화합니다 .


1

나는 여기서 비슷한 질문에 답했다 . 나는 항상 같은 문제를 일으키는 많은 곳을 살펴 보았다. 기본적으로 가중치에 값을 할당하고 싶지 않고 단순히 가중치를 변경합니다. 위 답변의 짧은 버전은 다음과 같습니다.

tf.keras.backend.set_value(tf_var, numpy_weights)


0

다음은 완전한 작업 예입니다.

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에 도달합니다 (비용 함수 기준).

참고 : 원래 대화 형 세션을 사용했습니다. 대화 형 세션은 동일한 스크립트에서 여러 세션을 실행해야 할 때 유용합니다. 그러나 단순성을 위해 비대화 형 세션을 사용했습니다.


0

최신 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)

-1

그래서 세션을 실행하기 전에 값을 할당해야하는 다른 경우가 있었기 때문에 이것이 가장 쉬운 방법이었습니다.

other_variable = tf.get_variable("other_variable", dtype=tf.int32,
  initializer=tf.constant([23, 42]))

여기에서 변수를 만들고 동시에 값을 할당합니다.


-10

더 쉬운 접근 방식이 있습니다.

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

3
op는 tf.assign덧셈이 아니라 의 사용법을 조사하고있었습니다 .
vega
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.