필자가 딥러닝을 배우기시작하면서 선택한 프레임워크인데 생각보다 어렵지는 않다.
그러나 필자가 블로그에 포스팅 하는 부분들 중에서는 거의 해본적없는 분야이고
빨리 빨리 바뀌기에 이 포스터는 항상 맞을수 없다고 볼 수 있다.
그러기 때문에 읽는 입장에서 그 부분을 고려해서 읽길 바란다.
이 포스터는 Python3.6으로 Tensorflow1.2로 테스팅 했으며 작업환경은 PyCharm이며 특별한 경우가 아니면 쉘에서 실행하지 않음.
결국 그래프가 없으면 세션은 실행할수 없다는 이야기와 일맥 상통하며 sess.run(node)라는 코드는
해당 그래프에서 node지점까지 실행해라는 의미이다.
그런데 아무리 생각해도 여러분들은 그래프를 만든적은 없다.
사실 여러분이 만든건 아니고 여러분이 만들지 않았다면 다른 변수를 선언한 시점에서 자동으로 그래프를 만들어 준다.
import tensorflow as tf
a = tf.constant(5, name='input_a')
b = tf.constant(7, name='input_b')
c = tf.multiply(a, b, name='mul_c')
d = tf.add(a, b, name='add_d')
e = tf.add(c, d, name='add_e')
sess = tf.Session()
print(sess.run(e))
import tensorflow as tf
g = tf.get_default_graph()
a = tf.constant(5, name='input_a')
b = tf.constant(7, name='input_b')
c = tf.multiply(a, b, name='mul_c')
d = tf.add(a, b, name='add_d')
e = tf.add(c, d, name='add_e')
sess = tf.Session(graph=g)
print(sess.run(e))
import tensorflow as tf
g = tf.Graph()
a = tf.constant(5, name='input_a')
b = tf.constant(7, name='input_b')
c = tf.multiply(a, b, name='mul_c')
d = tf.add(a, b, name='add_d')
e = tf.add(c, d, name='add_e')
sess = tf.Session(graph=g)
print(sess.run(e))
이 코드에서는 그래프를 생성자를 사용해서 명시적으로 선언해준다.
이 그래프는 기본 그래프와는 다른 또다른 그래프이다. 즉 두번째 그래프인 것이다.
첫번째 그래프는 디폴트로 생성하고 두번째 부터는 명시적으로 선언해주면 되며 명시적으로 선언한 그래프를 사용할 수 있다.
그러나 여기서 의문이 생길것이다. 세션을 만들 때 그래프를 지정하는데 그러면 한세션마다 한그래프만 가능하냐는 것이다.
좋은 질문이다. 결론부터 말하면 그렇다.
한 세션은 하나의 그래프만 담을 수 있으며 각 그래프 지점을 실행할 수 있다.
따라서 두개의 그래프를 실행하고 싶다면 당연히 두개의 세션이 필요하다는 것이다.
아래의 코드는 두개의 그래프를 실행하고 두개의 세션을 실행한 예제이다.
import tensorflow as tf
g1 = tf.get_default_graph()
g2 = tf.Graph()
with g1.as_default():
a1 = tf.constant(5, name='input_a1')
b1 = tf.constant(7, name='input_b1')
c1 = tf.multiply(a1, b1, name='mul_c1')
d1 = tf.add(a1, b1, name='add_d1')
e1 = tf.add(c1, d1, name='add_e1')
with g2.as_default():
a2 = tf.constant(10, name='input_a2')
b2 = tf.constant(9, name='input_b2')
c2 = tf.multiply(a2, b2, name='mul_c2')
d2 = tf.add(a2, b2, name='add_d2')
e2 = tf.add(c2, d2, name='add_e2')
sess1 = tf.Session()
# sess1 = tf.Session(graph=g1)
sess2 = tf.Session(graph=g2)
print(sess1.run(e1))
print(sess2.run(e2))
위의 예제는 그래프를 두개를 만든 예제인데 with구문으로 블록을 만들어서 각각의 그래프를 만든것을 알 수 있다.
굳이 이렇게 까지 하는 이유는 구문을 쓰지않으면 무조건 default그래프의 노드라 인식하기 때문이다.
오직 with구문의 as_default()구문에서만 유효하기 때문이다.
따라서 with구문을 사용해서 블럭을 지정한 후 내부에 노드를 지정해줘야한다.
실행 해보면 두 그래프 모두 정상작동함을 알 수 있다.
'Programming > Python-Tensorflow' 카테고리의 다른 글
[Tensorflow-06] 변수 (0) | 2017.08.04 |
---|---|
[Tensorflow-05] Fetches, Feed Dictionary, Place Holder (0) | 2017.08.02 |
[Tensorflow-03] 텐서 (0) | 2017.08.02 |
[Tensorflow-02] 텐서보드에서 그래프 보기 (0) | 2017.08.01 |
[Tensorflow-01] 상수 선언과 간단한 연산, 결과보기 (0) | 2017.08.01 |