728x90
Tensorflow는 현존하는 머신러닝 프레임워크 중 가장 유명한 프레임 워크이다.

필자가 딥러닝을 배우기시작하면서 선택한 프레임워크인데 생각보다 어렵지는 않다.


그러나 필자가 블로그에 포스팅 하는 부분들 중에서는 거의 해본적없는 분야이고

빨리 빨리 바뀌기에 이 포스터는 항상 맞을수 없다고 볼 수 있다.

그러기 때문에 읽는 입장에서 그 부분을 고려해서 읽길 바란다.


이 포스터는 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))


달라진 점이라면 g라고 그래프를 명시적으로 선언해준점, 또한 Session의 매개변수로 그래프를 넣은것이다.
그러나 우리는 디폴트 그래프를 생성한 것이고 세션에도 디폴트 그래프를 넣었다.

따라서 위의 코드나 아래의 코드나 사실 완벽하게 똑같이 작동한다.
따라서 기본 그래프를 사용한다면 아래와같이 사용할 필요는 없다.

물론 우리가 그래프를 직접적으로 선언해줄 수 도 있다.
이 경우 코드는 아래와 같다.

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구문을 사용해서 블럭을 지정한 후 내부에 노드를 지정해줘야한다.


실행 해보면 두 그래프 모두 정상작동함을 알 수 있다.

+ Recent posts