# Tensorflow : Constant, Placeholder
Tensorflow에는 특정 규칙이 필요하다. 그러므로 일반 프로그래밍 언어들처럼 변수에 값을 할당한 후에 콘솔 또는 GUI로 즉시 출력하는 것이 불가능하다.
이전 포스팅에서 언급한 것 처럼, Tensorflow는 '데이터 플로우 그래프(Data flow graph)로 표현하기 위한 도구'이다. 여기서 말하는 데이터 플로우 그래프는 '노드와 노드 간 엣지(선)'를 의미한다.
마치 C의 include와 같은 의미인데, 여기서는 다음과 같이 사용한다.
(자바와 비슷하다고 보면 좋을 것 같다. 문법적으로)
import tensorflow as tf
Tensorflow를 tf라는 애칭을 갖도록 하여 import한다는 의미이다. tf가 아닌 다른 용어를 써도 무방하지만, 일반적으로 사용되는 방법이고 어차피 우리에게는 중요한 부분이 아니기 때문에 굳이 신경쓰지 않으려고 한다. (실제로도 신경 쓸 필요 없다. 그냥 저렇게 쓰자)
Session 객체를 생성하려면 다음과 같이 작성하면 된다.
sess = tf.Session()
sess라는 이름을 가진 Session 객체를 선언하였다.
그런데 이렇게 글로만 적으면 Session 객체를 선언하라고는 했지만 정작 중요성에 대해서는 인지하기가 어렵다. 예제를 한번 살펴보자.
import tensorflow as tf
node1 = tf.constant(3.0, tf.float32)
node2 = tf.constant(4.0)
node3 = tf.add(node1, node2)
print("node1 : ", node1, "node2 : ", node2)
print("node3 : ", node3)
위의 예제는 node1, node2 각각의 노드를 생성하고, 이곳에 constant 함수를 사용하여 3.0, 4.0 값을 할당한 후에 이를 출력하는 과정을 보인다. (위에서 변수라는 단어를 적지 않았는데, 이는 추후에 설명한다)
constant 함수는 특정 노드에 상수 값을 할당하는 함수이다. 실제 정의는 다음과 같다.
tf.constant(value, dtype, shape, name)
import tensorflow as tf
node1 = tf.constant(3.0, tf.float32)
node2 = tf.constant(4.0)
node3 = tf.add(node1, node2)
sess = tf.Session()
print("node1 : ", sess.run(node1), "node2 : ", sess.run(node2))
print("node3 : ", sess.run(node3))
print("[node1, node2] : ", sess.run([node1, node2]))
print("node3 directly added : ", sess.run(node1 + node2))
그리고 결과 값은 다음과 같다.
node1 : 3.0, node2 : 4.0
node3 : 7.0
[node1, node2] : [3.0, 4.0]
node3 directly added : 7.0
기존 방식은 변수를 생성하지 않고 단순히 노드에 임시적인 값을 할당한 것이었기 때문에, Placeholder는 완벽한 차이점을 보여준다.
예제를 살펴보자.
import tensorflow as tf
a = tf.placeholder(tf.float32)
b = tf.placeholder(tf.float32)
adder_node = a + b
print(sess.run(adder_node, feed_dict={a : 3, b : 4.5}))
print(sess.run(adder_node, feed_dict={a : [1,3], b : [2,4]}))
tf.placeholder를 이용하여 float32(실수)형의 변수 a, b를 생성하였다.
(C로 표현하자면, float a와 같다)
adder_node는 생성된 변수 a, b를 통해 얻은 값을 더하기 위한 변수로 생성되었다.
a, b의 값에 따라 변경되기 때문에 같이 변수라고 봐도 좋을 것 같다.
placeholder로 선언된 변수는 feed_dict 함수를 이용하여 값을 할당받는다. 단일 값으로 할당 받을수도 있지만, Matrix와 같은 형태로도 할당 받을 수 있다.
add_and_triple = adder_node * 3
print(sess.run(add_and_triple, feed_dict={a : 3, b : 4.5}))
adder_node 변수를 그대로 이용하여 add_and_triple 변수의 계산에 사용할 수도 있다.
이렇게 되면, adder_node를 먼저 계산한 후에 결과 값을 이용하여 add_and_triple을 계산하여 결과 값을 도출하게 된다. 결과 값은 예상한대로 22.5가 출력된다.
이전 포스팅에서 언급한 것 처럼, Tensorflow는 '데이터 플로우 그래프(Data flow graph)로 표현하기 위한 도구'이다. 여기서 말하는 데이터 플로우 그래프는 '노드와 노드 간 엣지(선)'를 의미한다.
1. Import
우선 Tensorflow를 사용하기 위해, Tensorflow를 사용하겠다는 일종의 선언이 필요하다.마치 C의 include와 같은 의미인데, 여기서는 다음과 같이 사용한다.
(자바와 비슷하다고 보면 좋을 것 같다. 문법적으로)
import tensorflow as tf
Tensorflow를 tf라는 애칭을 갖도록 하여 import한다는 의미이다. tf가 아닌 다른 용어를 써도 무방하지만, 일반적으로 사용되는 방법이고 어차피 우리에게는 중요한 부분이 아니기 때문에 굳이 신경쓰지 않으려고 한다. (실제로도 신경 쓸 필요 없다. 그냥 저렇게 쓰자)
2. Session
Tensorflow에서는 입력받은 데이터를 데이터 플로우 그래프로 만들어서 이를 출력하는 방식을 사용한다. 그래프를 만들고 실행하기 위해 Tensorflow에서는 Session이라는 객체를 요구한다. 정리하자면, Tensorflow에서의 모든 입력 값에 대한 출력들은 Session 객체를 통해 이루어진다.Session 객체를 생성하려면 다음과 같이 작성하면 된다.
sess = tf.Session()
sess라는 이름을 가진 Session 객체를 선언하였다.
그런데 이렇게 글로만 적으면 Session 객체를 선언하라고는 했지만 정작 중요성에 대해서는 인지하기가 어렵다. 예제를 한번 살펴보자.
import tensorflow as tf
node1 = tf.constant(3.0, tf.float32)
node2 = tf.constant(4.0)
node3 = tf.add(node1, node2)
print("node1 : ", node1, "node2 : ", node2)
print("node3 : ", node3)
위의 예제는 node1, node2 각각의 노드를 생성하고, 이곳에 constant 함수를 사용하여 3.0, 4.0 값을 할당한 후에 이를 출력하는 과정을 보인다. (위에서 변수라는 단어를 적지 않았는데, 이는 추후에 설명한다)
constant 함수는 특정 노드에 상수 값을 할당하는 함수이다. 실제 정의는 다음과 같다.
tf.constant(value, dtype, shape, name)
- value : 상수 값
- dtype : 값의 타입 (대부분 tf.int32 - 정수 , tf.float32 - 실수를 사용)
- shape : 데이터 모양. 몇차원인지, 몇개의 요소를 갖는지 등을 표현
- name : 상수 이름
다시 돌아와서, 위의 print 문을 출력하였을 때, 우리가 예상하는 결과 값은 이럴 것이다.
node1 : 3.0, node2 : 4.0
node3 : 7.0
하지만, 실제 출력 결과는 어이없게도 다음과 같다.
node1:
Tensor("Const_1:0", shape=(), dtype=float32) node2:
Tensor("Const_2:0", shape=(), dtype=float32)
node3: Tensor("Add:0", shape=(),
dtype=float32)
자세히 살펴보면 Tensor라는 단어 뒤에 우리가 위에서 언급한 constant 함수의 정의가 들어가 있음을 볼 수 있다. 왜 값이 아닌 함수의 정의가 들어가있는 것일까? 바로 Session으로 호출하지 않았기 때문이다.
그렇다면 Session 객체를 만들고 이를 이용해보자.
node1 = tf.constant(3.0, tf.float32)
node2 = tf.constant(4.0)
node3 = tf.add(node1, node2)
sess = tf.Session()
print("node1 : ", sess.run(node1), "node2 : ", sess.run(node2))
print("node3 : ", sess.run(node3))
print("[node1, node2] : ", sess.run([node1, node2]))
print("node3 directly added : ", sess.run(node1 + node2))
그리고 결과 값은 다음과 같다.
node1 : 3.0, node2 : 4.0
node3 : 7.0
[node1, node2] : [3.0, 4.0]
node3 directly added : 7.0
3. Placeholder
Placeholder는 데이터를 입력받을 변수를 선언하는 방법이다. 말 그대로 쉽게 표현하자면, '변수를 담는 바구니를 생성하는 과정'이다. 그냥 변수 생성이라고 하자.기존 방식은 변수를 생성하지 않고 단순히 노드에 임시적인 값을 할당한 것이었기 때문에, Placeholder는 완벽한 차이점을 보여준다.
예제를 살펴보자.
import tensorflow as tf
a = tf.placeholder(tf.float32)
b = tf.placeholder(tf.float32)
adder_node = a + b
print(sess.run(adder_node, feed_dict={a : 3, b : 4.5}))
print(sess.run(adder_node, feed_dict={a : [1,3], b : [2,4]}))
tf.placeholder를 이용하여 float32(실수)형의 변수 a, b를 생성하였다.
(C로 표현하자면, float a와 같다)
adder_node는 생성된 변수 a, b를 통해 얻은 값을 더하기 위한 변수로 생성되었다.
a, b의 값에 따라 변경되기 때문에 같이 변수라고 봐도 좋을 것 같다.
placeholder로 선언된 변수는 feed_dict 함수를 이용하여 값을 할당받는다. 단일 값으로 할당 받을수도 있지만, Matrix와 같은 형태로도 할당 받을 수 있다.
add_and_triple = adder_node * 3
print(sess.run(add_and_triple, feed_dict={a : 3, b : 4.5}))
adder_node 변수를 그대로 이용하여 add_and_triple 변수의 계산에 사용할 수도 있다.
이렇게 되면, adder_node를 먼저 계산한 후에 결과 값을 이용하여 add_and_triple을 계산하여 결과 값을 도출하게 된다. 결과 값은 예상한대로 22.5가 출력된다.
댓글
댓글 쓰기