패키지 불러오기
xxxxxxxxxx
import numpy as np
import tensorflow as tf
print("Version : %s" % (tf.__version))
SESSION
x
session = tf.Session()
print ("open session")
텐서플로는 기본적으로 설계도를 만드는 구조이다. 텐서플로의 가장 큰 장점중 하나는 computational graph를 그리는데 유용하다는 것이다. 그래프를 만들고 입력을 넣어 흐름에 따라 웨이트가 학습되는 것을 말한다.
이런 연산을 실행하는 키 같은 것이 세션이다.
CONSTANT
일반적으로 변하지 않는 특정 값을 상수라고 한다. 텐서플로에서 상수를 생성하기 위해서는 tf.constant()
를 사용하면 된다.
x
#타입과 값 확인
def print_tf(x):
print("TYPE : %s" % (type(x)))
print("VALUE : %s" % (x))
hello = tf.constant("Hello Tensorflow!")
print_tf(hello)
출력
xxxxxxxxxx
TYPE : <class 'tensorflow.python.framework.ops.Tensor'>
VALUE : Tensor("Const:0", shape=(), dtype=string)
tf.constant
를 통해 문자열을 상수로 정의했다. 하지만 타입과 값은 우리가 지정한 값이 나오지 않는다. 우리가 입력한 값을 얻기 위해서는 session.run()을 실행해야한다.
x
hello_out = session.run(hello)
print_tf(hello_out)
xxxxxxxxxx
TYPE : <class 'bytes'>
VALUE : b'Hello Tensorflow!'
문자열이 아닌 bytes형으로 출력되는데 문자열로 변환하기 위해서는 decode 함수가 필요하다
xxxxxxxxxx
hello_out = session.run(hello)
print_tf(hello_out.decode(encoding='utf-8'))
xxxxxxxxxx
TYPE : <class 'str'>
VALUE : HELLO. IT'S ME.
문자열 이외에도 다양한 값을 상수로 지정할 수 있다.
xxxxxxxxxx
#other type
a = tf.constant(1.5)
b = tf.constant(2.5)
print_tf(a)
print_tf(b)
a_out = session.run(a)
b_out = session.run(b)
print_tf(a_out)
print_tf(b_out)
xxxxxxxxxx
TYPE : <class 'tensorflow.python.framework.ops.Tensor'>
VALUE : Tensor("Const_1:0", shape=(), dtype=float32)
TYPE : <class 'tensorflow.python.framework.ops.Tensor'>
VALUE : Tensor("Const_2:0", shape=(), dtype=float32)
TYPE : <class 'numpy.float32'>
VALUE : 1.5
TYPE : <class 'numpy.float32'>
VALUE : 2.5
이것도 위와 동일하게 값을 얻기 위해서는 run을 실행해야한다.
OPERATOR
xxxxxxxxxx
# OPERATORS WITH FIXED INPUTS
a_plus_b = tf.add(a,b)
print_tf(a_plus_b)
# RUN OPERATOR
a_plus_b_out = sess.run(a_plus_b)
print_tf(a_plus_b_out)
a_mul_b = tf.multiply(a, b)
a_mul_b_out = sess.run(a_mul_b)
print_tf(a_mul_b_out)
우리가 만든 a라는 공간과 b라는 공간을 더하는 작업을 정의하는 것이다. 이 add를 호출하려면 역시 session.run()을 실행하면 된다. 실행하면 a와 b에 있는 값을 가져와서 정의했던 add를 수행해주고, 그 결과를 가져온다.
이처럼 상위 노드에서 값을 호출하면 알아서 하위 레이어의 값들을 가져와 값을 리턴해준다. 그래서 텐서플로를 코딩은 블록쌓는것처럼 밑단을 만들고 차곡차곡 선언하여 맨 위의 레이어를 콜하면 모든 결과를 가져올 수 있따. 이런걸 컴퓨테이셔널 그래프라고 한다.
add이외에도 multiply 등 여러 연산을 지정할 수 있다.
VARIABLE
VARIALBE은 변수를 의미하며 변하는 값을 지정해 주는 것이다. 텐서플로에서 VARABLE이란? 우리가 학습시키고 싶은 파라미터를 의미한다. NN의 weight나 CNN의 convolutional filter 같은 것이다. 일반적으로 0으로 초기화하는 것이 아닌 가우시안 분포에서 뽑게된다.
x
# VARLABELS
weight = tf.Variable(tf.random_normal([5, 2], stddev=0.1))
print_tf(weight)
xxxxxxxxxx
TYPE : <class 'tensorflow.python.ops.variables.RefVariable'>
VALUE : <tf.Variable 'Variable:0' shape=(5, 2) dtype=float32_ref>
이제 weight를 세션에서 실행해본다.
x
# GET VALUES?
weight_out = sess.run(weight)
print_tf(weight_out)
xxxxxxxxxx
ERROR
이전과 동일하게 했지만 오류가 발생한다. VARIABLE은 항상 초기화를 시켜줘야 하기 때문이다. 이것을 수행시켜 주는 것이 tf.global_variables_initializer()
이다.
xxxxxxxxxx
# INITIALIZATION REOUIRED
init = tf.global_variables_initializer()
session.run(init)
print ("INITIALISING ALL VARIALBES")
weight_out = session.run(weight)
print_tf(weight_out)
xxxxxxxxxx
TYPE : <class 'numpy.ndarray'>
VALUE : [[-0.0584572 0.11482535]
[ 0.06749582 -0.00817135]
[-0.06873789 -0.04678125]
[-0.02855667 -0.02550266]
[ 0.10920276 -0.16299999]]
초기화를 수행해 주면 정상적으로 실행된다. 실행할 때 마다 다른 값이 할당된다.
PLACEHOLDERS
PLACEHOLDERS는 입출력을 위한 통로이다. 학습을 위한 입력과 출력 데이터를 주는데 쓰인다.
x
# PLACEHOLDERS
x = tf.placeholder(tf.float32, [None, 5])
print_tf(x)
x
TYPE : <class 'tensorflow.python.framework.ops.Tensor'>
VALUE : Tensor("Placeholder:0", shape=(?, 5), dtype=float32)
placehoder의 두번째 파라미터로 들어가는 배열은 [data_수, data_demension]을 의미한다. NONE은 데이터 크기가 미정이라는 것이고 5는 데이터의 dimension을 의미한다.
OPERATOR를 통해 행렬의 연산을 정의한다.
xxxxxxxxxx
# OPERATION WITH VARIABLES AND PLACEHOLDERS
oper = tf.matmul(x, weight)
print_tf(oper)
x
TYPE : <class 'tensorflow.python.framework.ops.Tensor'>
VALUE : Tensor("MatMul:0", shape=(?, 2), dtype=float32)
shape=(?,2)
로 출력되는데, ?는 PLACEHODER의 사이즈가 ?이기 때문에 ?로 나오고 2는 위에서 정의한 weight
가 [5,2]인데 행렬 연산을 수행하게되면 2인 것을 알 수 있기 때문이다.
즉 이 과정은 ?x5형태의 행렬을 입력받아 weight인 5x2 행렬을 곱하여 ?x2의 행렬을 출력하는 것이다.
x
# FEED_DICT PLACEHOLDER
data = np.random.rand(1, 5)
oper_out = sess.run(oper, feed_dict={x : data})
print_tf(oper_out)
xxxxxxxxxx
TYPE : <class 'numpy.ndarray'>
VALUE : [[-0.06789464 -0.12618345]]
feed_dict
으로 PLACEHOLDER라는 통로에 값을 집어 넣는 것이다. 여기서 data
는 1x5의 행렬이기 때문에 출력 결과가 1x2 형태의 행렬이 나온다.
xxxxxxxxxx
# BATCHSIZE CAN VARY
data = np.random.rand(10, 5)
oper_out = sess.run(oper, feed_dict={x: data})
print_tf(oper_out)
xxxxxxxxxx
TYPE : <class 'numpy.ndarray'>
VALUE : [[-0.01312374 0.18576905]
[-0.00970382 0.01323589]
[ 0.11908764 0.03432912]
[-0.11563961 0.06638182]
[ 0.18647468 0.15940022]
[-0.05080821 0.00564926]
[-0.01766969 0.06620809]
[ 0.05855357 0.07500833]
[ 0.03088063 0.04856187]
[ 0.08465045 0.11661711]]
data
를 10x5로 해주면 출력은 10x2행렬이 된다.
PLACEHOLDER를 통해 학습 데이터를 넣어주고, OPERATOR를 통해 여러 연산들을 정의하여 출력을 얻을 수 있게 된다. 이런 과정으로 텐서플로를 통해 학습을 진행할 수 있다.