세션( tf.Session )을 이용하여 그래프 전체 또는 일부를 실행하여 계산 결과를 출력하는 방법을 다룹니다.

tf.Session 클래스는 텐서플로우의 오퍼레이션, 즉 노드를 실행하기 위한 클래스입니다.


텐서플로우 공식 문서, stackoverflow 등 여러 인터넷 상의 자료를 바탕으로 공부하며 작성한 포스팅이며  아직 부족한 점이 많습니다.


계속 보완될 예정이며 잘못된 부분이 있으면 댓글로 알려주세요.



최초 작성 2018.  10. 17




tf.Session.run 메소드는 오퍼레이션 객체(tf.Operation)를 실행하거나  텐서 객체(tf.Tensor)의 값을 구하기 위한 주요 메커니즘입니다.

세션 사용이 끝나면 tf.Session.close() 호출하여 자원을 해제해줘야 합니다.


import tensorflow as tf


tensor_a = tf.constant(100, name='a')

# 텐서 a의 값이 출력되지 않습니다. 아직 텐서 a의 값은 정해지지 않았습니다.
print(tensor_a)

# 세션을 생성하여 run 메소드를 사용해야 텐서의 값이 정해집니다.  
sess1 = tf.Session()
print(sess1.run(tensor_a))

sess1.close()


Tensor("a:0", shape=(), dtype=int32)

100




세션 객체는 자신만의 물리적  자원(GPU, 네트워크 연결 등)을 가지고 있기 때문에  블럭이 끝나면 자동으로 자원을 해제해주는 with 블럭내에서 사용하는 것을 권장합니다.

with 블럭내에서는 세션의  run 메소드 대신에 텐서의 eval 메소드를 사용할 수 있습니다.


import tensorflow as tf



a = tf.constant(100, name='a')

with tf.Session() as sess:
   print(a.eval())


100




tf.Session.run 메소드에 전달된 텐서 객체를 계산하기 위해 필요한 오퍼레이션들이 있다면 먼저 계산된 후.. 원하는 텐서의 값이 구해집니다.


import tensorflow as tf


a = tf.constant(100, name='a')
b = tf.constant(2, name='b')
c = a * b

sess1 = tf.Session()

# 텐서 객체 c를 구하려면 텐서 객체 a, b의 값을 구하고, 이 둘을 곱하는 연산을 해야 합니다.
print(sess1.run(c))

sess1.close()




플레이스홀더( tf.placeholder )를  입력으로 사용하는 경우에는 tf.Session.run 메소드에서 실행하려는 연산을 위해 필요한 플레이스 홀더의 이름과 해당 플레이스홀더에서 사용하게 되는 값들을 딕셔너리 형태로 지정해줘야 합니다.


import tensorflow as tf


x = tf.placeholder(tf.float32, shape=[3])
y = tf.square(x)

with tf.Session() as sess:

 # 텐서 y를 계산하려면 필요한 플레이스홀더 이름 x와

 # 플레이스홀더에서 사용할 값을 딕셔너리 형태로 입력해줍니다.
 print(sess.run(y, {x: [1.0, 2.0, 3.0]}))
 print(sess.run(y, {x: [4.0, 5.0, 6.0]}))


[1. 4. 9.]

[16. 25. 36.]




입력으로 사용되는 플레이스홀더를 지정해주지 않거나 플레이스홀더 정의할때 지정한 shape와 다른 입력을 사용하면 에러가 발생합니다.


import tensorflow as tf


x = tf.placeholder(tf.float32, shape=[3])
y = tf.square(x)

with tf.Session() as sess:
 print(sess.run(y))

# tensorflow.python.framework.errors_impl.InvalidArgumentError: You must feed a value for placeholder tensor 'Placeholder' with dtype float and shape [3]
# [[{{node Placeholder}} = Placeholder[dtype=DT_FLOAT, shape=[3], _device="/job:localhost/replica:0/task:0/device:CPU:0"]()]]


import tensorflow as tf


x = tf.placeholder(tf.float32, shape=[3])
y = tf.square(x)

with tf.Session() as sess:
 print(sess.run(y, {x: 4.0}))

# ValueError: Cannot feed value of shape () for Tensor 'Placeholder:0', which has shape '(3,)'




텐서플로우에서는 tf.Session 클래스 외에 tf.InteractiveSession 클래스도 제공합니다.

세션(Session)과의 차이점은 tf.InteractiveSession이 자체 기본 세션으로 설치된다는 것입니다.

그래서 tf.InteractiveSession을 사용할 경우 with 없이도 텐서의 eval 메소드를 사용할 수 있습니다.


>>> import tensorflow as tf
>>> a = tf.constant(2)
>>> sess = tf.InteractiveSession()
>>> a.eval()
2




해봤어요 www.facebook.com/webnautes/

+ Recent posts

티스토리 툴바