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

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


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

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

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


이 포스터는 Python3.6으로 Tensorflow1.2로 테스팅 했으며 작업환경은 PyCharm이며 특별한 경우가 아니면 쉘에서 실행하지 않음.


Fetches란 컴퓨터 용어로는 무언가를 가져오는 것을 뜻한다.

그래서 텐서플로우에서는 fetche라는 것은 결과를 받는것을 의미한다.

당연하지만 결과를 받아온다는건 텐서 객체를 받아온다는걸 의미한다.


우리는 텐서객체를 결과값을 받아온 기억이 있는가?

당연하지만 있다. sess.run이라는 메소드의 결과는 텐서로 나오며

그 결과를 가시적으로 보기위해서 print라는 출력을 사용하였다.

즉 sees.run의 결과는 fetche라고 봐도 무방하다는 것이다.


fetche가 뭔지는 알았다. sees.run으로 실행되는 결과가 fetche라는 건데

이제 중요한점은 sess.run에 들어가는 값이다. 즉 fetche의 결과를 정하는 요소에 대해서 알아보자는 것이다.

이미 sees.run에는 텐서가 들어간다는 것은 알았다. 그러나 이때까지 텐서들의 요소들은 고정되어 있었다.

그럼 경우에 따라서 특정 텐서를 바꿔줄 수 있을까? 가능하다.

그 방법은 바로 Feed Dictionary와 Place Holder이다. 이제 이들이 뭔지 알아보자.

먼저 Feed Dictionary에 대해서 알아보자.


Feed Dictionary


저번 부터 줄기차게 봐왔던 예제를 보자.


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


우리는 a,b,c,d,e라는 노드를 만들었다.

그리고 현재 그래프의 종단지점인 e의 결과를 fetche하였다.

그런데 사용하는 도중에 갑자기 a의 값을 바꾸고 싶어졌다고 가정해보자.

지금은 a는 5임을 알 수 있지만 도중에 a의 값을 10으로 바꾸고 싶다는 것이다.


물론 가장 간단하게 생각해보면 a노드의 값을 직접 10으로 바꿔도 무방하다.

그런데 예를들어서 루프를 도는데 특정 경우의 a의 값을 바꾼다던가 하는 경우를 생각해보자.


즉 필자가 하고싶은 말은 특별한 경우에 a를 바꾸고 싶어질 경우 그 a를 바꿀 수 있는지에 대한 이야기이다.


거기에 대한 해결책이 Feed Dictionary이며 이를 사용하면 특정 노드의 값을 바꿀 수 있다.


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, feed_dict={a: 10}))


해당 예제는 Feed Dictionary를 사용해서 a값을 특정 값으로 오버로딩한 예제이다.

a값은 원래 5였으나 도중에 10과 바꿔채진 것이다. 물론 Feed Dictionary는 두개 이상의 값 역시 가능하다.

이번 예제는 a는 10으로, b는 20으로 바꿔보겠다.


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, feed_dict={a: 10, b: 20}))


위의 예제는 a와 b의 값이 모두 변경된다. 한번 실행시켜 보자.


Place Holder


위의 예제를 잘보면 알겠지만 만약 값을 Feed Dictionary를 사용한다면 위처럼 값을 지정해주는건 무의미하다.

어짜피 뒤에 값을 입력받는데 앞에 뭐하러 값을 선언하는가.

그렇기 때문에 이렇게 뒤에 값을 받아서 집어넣기만 하는 값이 있다면(즉 input으로만 값을 받는다면)

굳이 노드에 값을 선언할 필요가 없다는 뜻이된다.


이런 경우 값을 비워두고 input받는 데이터라는 것을 명시적으로 선언하는 방법이 있다.

그게 바로 Place Holder이다.


import tensorflow as tf

a = tf.placeholder(tf.int32, shape=[])
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, feed_dict={a: 10}))


이번에는 a라는 노드를 Place Holder로 선언했다.

이렇게 Place Holder로 선언하게 되면 해당 값은 무조건적으로 Feed Dictionary를 사용해서 값을 넣어야만 한다.

a라는 값은 텐서모양은 0차원 텐서인 스칼라이다. 따라서 a에서 텐서 모양을 지정할 수 있다.

'Programming > Python-Tensorflow' 카테고리의 다른 글

[Tensorflow-07] Name Scope  (0) 2017.08.04
[Tensorflow-06] 변수  (0) 2017.08.04
[Tensorflow-04] 그래프  (0) 2017.08.02
[Tensorflow-03] 텐서  (0) 2017.08.02
[Tensorflow-02] 텐서보드에서 그래프 보기  (0) 2017.08.01

+ Recent posts