TensorFlow에서 Session.run ()과 Tensor.eval ()의 차이점은 무엇입니까?


204

TensorFlow에는 두 가지 방법으로 그래프의 일부를 평가할 수 있습니다 : Session.run변수 목록 및 Tensor.eval. 이 둘 사이에 차이점이 있습니까?


풀 네임 스페이스 tf.Tensor.eval()tf.Session.run(),하지만 연결은 tf.Operation.run()tf.Tensor.eval()에 설명 된대로 여기
prosti

답변:


243

Tensort 가있는 경우 calling t.eval()는 calling 와 같습니다 tf.get_default_session().run(t).

다음과 같이 세션을 기본값으로 설정할 수 있습니다.

t = tf.constant(42.0)
sess = tf.Session()
with sess.as_default():   # or `with sess:` to close on exit
    assert sess is tf.get_default_session()
    assert t.eval() == sess.run(t)

가장 중요한 차이점은 sess.run()동일한 단계에서 많은 텐서의 값을 가져 오는 데 사용할 수 있다는 것입니다 .

t = tf.constant(42.0)
u = tf.constant(37.0)
tu = tf.mul(t, u)
ut = tf.mul(u, t)
with sess.as_default():
   tu.eval()  # runs one step
   ut.eval()  # runs one step
   sess.run([tu, ut])  # evaluates both tensors in a single step

호출 할 때마다 참고 eval하고 run처음부터 전체 그래프를 실행합니다. 계산 결과를 캐시하려면에 할당하십시오 tf.Variable.


두 번째 예의 차이점은 무엇입니까? 별도의 연산 (또는 그래프? 차이가 무엇인지 확실하지 않음)으로 평가할 수 있습니까?
피노키오

1
잠깐, 예제가 실제로 실행됩니까? 나는 시도 : a = tf.constant(2.0) b = tf.constant(3.0) ab = tf.matmul(a, b) 난 그냥 모양, 난 계급이 적어도 2 있어야한다는, 더 정확하게 추측 일치하지 않음을 tensorflow 불만을 가지고
피노키오

@Pinocchio 4 년 전 원래 답변이 게시되어 API가 변경되었다고 생각합니다. 나는 그것을 사용 tf.multiply(t, u)했고 잘 작동했다.
yuqli

42

텐서 흐름에 대한 FAQ 세션에는 정확히 같은 질문에 대한 답변이 있습니다. 계속해서 여기에 두겠습니다.


경우 tA는 Tensor객체 t.eval()에 대한 속기 sess.run(t)경우 ( sess현재 기본 세션은 코드의 다음 두 조각이 동일합니다. :

sess = tf.Session()
c = tf.constant(5.0)
print sess.run(c)

c = tf.constant(5.0)
with tf.Session():
  print c.eval()

두 번째 예에서 세션은 컨텍스트 관리자 역할을하며 이는 with블록 수명 동안 기본 세션으로 세션을 설치하는 효과가 있습니다. 컨텍스트 관리자 접근 방식은 간단한 사용 사례 (예 : 단위 테스트)를위한보다 간결한 코드로 이어질 수 있습니다. 코드에서 여러 그래프와 세션을 처리하는 경우을 명시 적으로 호출하는 것이 더 간단 할 수 있습니다 Session.run().

많은 것을 분명히 할 수 있으므로 FAQ 전체에서 최소한 탈지하는 것이 좋습니다.


2

eval() 리스트 객체를 처리 할 수 ​​없습니다

tf.reset_default_graph()

a = tf.Variable(0.2, name="a")
b = tf.Variable(0.3, name="b")
z = tf.constant(0.0, name="z0")
for i in range(100):
    z = a * tf.cos(z + i) + z * tf.sin(b - i)
grad = tf.gradients(z, [a, b])

init = tf.global_variables_initializer()

with tf.Session() as sess:
    init.run()
    print("z:", z.eval())
    print("grad", grad.eval())

하지만 Session.run()할 수 있습니다

print("grad", sess.run(grad))

내가 틀렸다면 나를 바로 잡아 줘


1

가장 기억해야 할 사항 :

TenorFlow에서 일정하고 변수 (결과)를 얻는 유일한 방법은 세션입니다.

이 모든 것을 아는 것은 쉽습니다 .

모두 tf.Session.run()tf.Tensor.eval()세션의 결과를 얻을 tf.Tensor.eval()호출에 대한 바로 가기입니다tf.get_default_session().run(t)


나는 또한 방법 개요 것 tf.Operation.run()같이 여기 :

세션에서 그래프가 시작된 후을 전달하여 작업을 실행할 수 있습니다 tf.Session.run(). op.run()호출 바로 가기입니다 tf.get_default_session().run(op).


0

tensorflow에서는 그래프를 작성하고 해당 그래프에 값을 전달합니다. Graph는 모든 노력을 기울이고 그래프에서 구성한 내용에 따라 출력을 생성합니다. 이제 그래프에 값을 전달하면 먼저 tensorflow 세션을 작성해야합니다.

tf.Session()

세션이 초기화되면 모든 변수와 설정이 이제 세션의 일부이므로 해당 세션을 사용해야합니다. 따라서 그래프에 허용되도록 외부 값을 그래프에 전달하는 두 가지 방법이 있습니다. 하나는 실행중인 세션을 사용하는 동안 .run ()을 호출하는 것입니다.

기본적으로 이것에 대한 지름길 인 다른 방법은 .eval ()을 사용하는 것입니다. .eval ()의 전체 형태는

tf.get_default_session().run(values)

직접 확인할 수 있습니다. values.eval()실행 장소에서 tf.get_default_session().run(values). 동일한 동작을 가져와야합니다.

eval 이하는 일은 기본 세션을 사용한 다음 run ()을 실행하는 것입니다.


0

Tensorflow 2.x 호환 답변 : mrry의 코드를 Tensorflow 2.x (>= 2.0)커뮤니티의 이익 을 위해 변환 합니다.

!pip install tensorflow==2.1
import tensorflow as tf

tf.compat.v1.disable_eager_execution()    

t = tf.constant(42.0)
sess = tf.compat.v1.Session()
with sess.as_default():   # or `with sess:` to close on exit
    assert sess is tf.compat.v1.get_default_session()
    assert t.eval() == sess.run(t)

#The most important difference is that you can use sess.run() to fetch the values of many tensors in the same step:

t = tf.constant(42.0)
u = tf.constant(37.0)
tu = tf.multiply(t, u)
ut = tf.multiply(u, t)
with sess.as_default():
   tu.eval()  # runs one step
   ut.eval()  # runs one step
   sess.run([tu, ut])  # evaluates both tensors in a single step
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.