2019년 3월 12일 화요일

[tensorflow] 자료형

   참조

   Tensorflow의 그래프와 세션

TensorFlow는 graph로 연산을 나타내는 프로그래밍 시스템이다. 뉴럴네트워크에 최적화되어 있는 개발 프레임워크이기 때문에, 자료형이나 실행 방식이 생소하다.

TensorFlow 프로그래밍을 위해서는 텐서의 그래프와 세션에 대한 이해가 필요하다.

아래는 TensorFlow 연산의 구조와 순서를 간단하게 나타낸 것이다.

TensorFlow는 3가지 LEVEL로 구성되어 있다. PYTHON, C, DEVICE이다. Python Level에서 연산의 구조인 Graph를 만들고, Device로 보내 임베딩시킨다. 그 후 최종적으로 C Level에서 연산이 이루어지게 된다.

위의 구조와 순서를 떠올리면서 Graph와 Session에 대해 알아보자.

Graph
TensorFlow에서 Graph는 중요한 의미를 가진다. TensorFlow로 뭔가를 작성한다는 것은 그래프를 생성한다는 것이다. 그래프를 그린다는 의미는 연산의 방식을 그래프로 표현할 수 있다는 의미이다.

그래프는 python 레벨에서 만들어지는데, 아래와 같은 수식을 갖는 모든 연산을 Python Level에서 그래프로 정의하게 된다.

A * B + C = ?


tensorFlow 그래프를 코드로 만들어 계산 값을 출력해보자.

계산 값이 나오지 않고, tensor의 속성만 볼 수 있다. tensor의 그래프는 생성되었지만 그래프 연산이 수행되지 않아 값이 나오지 않았기 때문이다. 그래프의 연산을 수행하려면 어떻게 돼야 할까?

Session
연산을 수행하기 위해서는 session을 생성하고, session에 그래프를 넣고 session을 돌리면(run)하면 된다. session이란 무엇일까?

Session은 Graph를 돌리는 단위로 file과 같다고 생각하면 쉽다. 파일에 그래프를 넣고 저장하고, 돌릴 수 있다.
그래프에 A, B, C 값을 넣어서 실행해야 하는데, 세션을 생성하여, 그래프를 실행해야 한다. 세션은 그래프를 인자로 받아서 디바이스에 올려주고 실행(Run)해준다.
(때문에 세션은 IDE 상에 존재할 수 없고, IDE 상의 Tensor 연산도 불가능하다.)



session을 생성하고 그래프를 세션에 입력한 후, 세션을 돌려보자.

그래프 연산이 수행되고, 연산의 결과가 나온 것을 볼 수 있다.



   Tensorflow의 자료형

Tensor
TensorFlow 프로그램은 모든 데이터를 tensor 데이터 구조로 나타낸다. 연산 graph에 있는 노드(연산, 작업)들 간에는 tensor만 주고받을 수 있기 때문이다. TensorFlow의 tensor를 n 차원의 배열이나 리스트라고 봐도 좋다. tensor는 정적인 타입(static type), 차원(rank), 형태(shape) 값을 가진다.

Constant
말 그대로 constant이다. 절대 변하지 않는 것. 상수 텐서이다. 아래와 같은 형태로 정의된다.

[코드]


  • value: 상수의 값
  • dtype: 상수의 데이터형. tf.float32와 같이 실수, 정수 등의 데이터 타입을 정의.
             (만약 dtype 인자가 결정되지 않을 경우, value로부터 타입을 추론하여    사용.)
  • shape: 행렬의 차원을 정의. shape=[3,3]으로 정의해주면, 이 상수는 3*3 행렬을 저장하게 됨.
  • name: name은 이 상수의 이름을 정의.

constant는 하나의 method 형태이고 자기 자신이 그래프가 되는 특징이 있다.

Placeholder
input data를 넣을 때, tensorflow와 mapping하는 역할을 함.
넣을 input data의 shape를 넣어야 함. datatype은 필수

그래프를 만들지 않음
placeholder은 하나의 method같은 역할

input data, numpy로 넘어오는 데이터를 가져다가 placeholder로 tensor에 mapping 시킬 때 씀.

placehodler은 뭘까?

ph1 = tf.placeholder(dtype=tf.float32) <- shape는 선택사항
ph2 = tf.placeholder(dtype=tf.float32)
ph3 = tf.placeholder(dtype=tf.float32)

값의 지정은 어떻게 해줘야 하는가? placeholder은 애초에 그래프를 만들지 않음. mapping 시키는 역할일 뿐, 값을 저장하지 않음. 그렇다면 어떤 식으로 코딩을 하느냐? feeding을 해줘야 함.

feeding은 어떻게 하는가? numpy array 나 list로 표현된 것을 아무거나 넣으면 됨.

value1 = 5
value2 = 3
value3 = 2

ph1 = tf.placeholder(dtype=tf.float32)
ph2 = tf.placeholder(dtype=tf.float32)
ph3 = tf.placeholder(dtype=tf.float32)

이제 mapping을 시켜주려면 어떻게 해야 하는가?

feed_dict = {ph1: value1, ph2: value2, ph3: value3}

sess = tf.Session()
                      //그래프, mapping한 것을 넣어줘야 함. 그러면 tensorflow에서는 tensor로 인식을 하고 연산을 함.
result = sess.run(result_value, feed_dict)

data를 input시킬 때, placeholder를 씀.
tensor는 tensor끼리만 연산할 수 잇어서 placeholder은 일반 list 등과 같은 자료형을 tensor로 계산하는데 유용하게 사용할 수 있음


Variable
객체로 정의됨.
객체이기 때문에 tf.Variable.__init__()의 parameter을 넣으면 됨.
weight 같은 것을 저장하는데 씀. weight Matrix를 variable로 만듦.
dtype도 정의하는 것이 좋다. 맞춰줘야 type error가 발생할 확률이 적다. warning으로 처리되긴 하지만 챙겨주는 것이 좋음

constant, Variable, placeholder는 그래프로 그리는 게 다르다. constant는 자기 자신이 그래프가 될 수 있다. 하지만 Variable은 다르다.

var1 = tf.Variable([5])
var2 = tf.Variable([3])
var3 = tf.Variable([2])

var4 = var1*var2+var3
print(var4)
>>아직 안 넘어갔으므로 tensor로 나온다.

session에 올려보면
sess = tf.Session()
result = sess.run(var4)
print(result)
>>error가 뜬다.
weight parameter를 담아두는 공간이 variable이라는 공간인데, weight는 언제나 초기화를 시켜야 한다. 반드시 초기화가 필요한 자료형이다. 초기화 함수가 따로 있어서 이 함수로 초기화해야 함.

tf.initialize_all_variables(), 얘를 session으로 돌려준다. 자체가 연산자, 함수이기 때문에 자신이 그래프를 가지고 잇다. 그래서 얘를 먼저 run 해줘야 variable의 값이 뿌려지고 그래프로서 효력을 발휘할 수 있다.

그래프의 값이 없어서 error가 나는 것인데, initialize를 함으로써, 값을 넣어주어야 error를 일으키지 않고 session을 run할 수 있음



댓글 없음:

댓글 쓰기