etc...

[Tensorflow] Basic of Tensorflow

빛나유 2016. 11. 27. 00:45

얼마전에 회사에서 일하다가 Tensorflow 때문에 살짝 자극받았다. 그리고 오늘 토요일!! Tensorflow 기본부터 조금씩 공부해봤다.


우선 Tensorflow는 Google에서 만든 Machine Learning Build-up package같은거라고 보면 된다. 보통 data mining할 때 sklearn같은 Python Package를 많이 사용한다. 여기에는 각종 data mining 알고리즘이 구현되어있다. Tensorflow는 레고조각 같은거다. 각 부품이 작성되어있고 그 부품을 이용해서 우리가 알고리즘을 구현하는 것이다. 


보통 language에 대해서는 포스팅을 안하는데, Tensorflow는 살짝 해두려고 한다. 일단 기존의 Python 작동방식과 조금 다르다. 그래서 헷깔릴수 있기 때문에 살짝 정리하련다. 


우선, Tensor가 뭔지 알아보자. Wikipedia에 보면 Tensor는 Scalar, Vector들의 linear relation을 표현한 어떤 Object라고 설명되어있다. 그래서 Dot Product와 같은 것들이 Tensor의 한 예라고 설명을 한다. 수학적으로 조금 약해서 정확하게 이해를 못 했지만, Tensorflow 공식 웹 페이지에는 Tensor는 n-dimensional array 또는 list라고 생각하면 된다고 한다. "생각하면 된다" 라고 말하는 것은, 정확한 개념은 아니라는 것이다.(나는 그렇게 생각한다) 정확히 아래와 같이 써있다.


You can think of a TensorFlow tensor as an n-dimensional array or list. A tensor has a static type, a rank, and a shape.


"think of" 뭐 그냥 그렇게 생각하면 된다. 라는 의미로 나는 해석했다. 아무튼 이 Tensor는 type, rank, shape이 있다고 한다. Rank부터 알아보자. Rank는 Linear Algebra에서 나왔던 그 rank가 아니다. 나도 잘 몰라서 Rank가 뭔지 정확한 개념으로는 설명을 못 하겠다. 그런데 이렇게 생각하면 쉽다.


"하나의 n-dimensional array 또는 list에서의 각각의 하나의 데이터를 표현하기 위한 index의 dimension"


예를 들어보자.

[1, 2, 3] 이라는 벡터!! 각각의 Index는 0, 1, 2 이런식으로 숫자 하나만 있으면 Index를 표현할 수 있다. 그래서 벡터의 rank는 1이다.


행렬의 rank는 2이다.

1, 2, 3

4, 5, 6

7, 8, 9


각각의 데이터를

(0, 0) = 1

(0, 1) = 2

(0, 2) = 3

...

(2, 2) = 9

와 같이 숫자 두개로 각각의 데이터를 표현할 수 있으니까. 그러니까 행렬들은 rank가 2이다.


shape은 python numpy에서 ".shape"하면 나오는 값과 같다.

1, 2, 3

4, 5, 6

과 같은 matrix는 당연히 shape은 (2, 3) rank는 행렬이니까 무조건 2이다. shape은 어렵지 않으니 간단히 넘어간다. 


Type도 어렵지 않다. 아래와 같은 여러가지 Type을 가진덴다. 그런데 Tensorflow에서는 Type은 잘 고려해줘야 되는 것 같다. 자동으로 형 변환이 안되는 것 같다.


Tensorflow에서 모든 변수들은 Tensor object로 표현된다. 변수는 아래의 세가지 방법으로 가능하다.

1. 상수선언 : tensorflow.constant()

2. 변수선언 : tensorflow.Variable()

3. 미리선언 : tensorflow.placeholder()


상수선언, 변수선언은 알겠는데 미리선언?? 이게 뭐냐?? 말 그대로 미리 자리잡아놓겠다는 것인데, 우선 그런게 있다고 알고 넘어가자. 조금 있다가 다 알게될 내용이다.


실제로 예제를 보자.

# source code


# result

1.0

[1 2 3]


위의 예제는 상수를 print하는 아주 간단한 예제이다. 상수 선언하는 부분은 별로 안어려운데 뭔가 이상한게 있다. "To print constant"라고 해서 상수 print하는 부분이 뭔가 조금 복잡하다. 


Tensorflow에서는 그냥 "print x"와 같이 간단하게 print가 안된다. 반드시 tf.Session()을 통해서 session 오픈하고 tf.Session().run()을 통해서 값을 받아서 print해야 한다. 이점이 기존의 Python과 상당히 다른 부분이다. 즉, tf.Session().run()을 하기 전까지는 그냥 값을 가질 준비만 되어있는 것이지 실제로 값을 가지고 있는 것은 아니라고 보면 된다. 모든 것은 tf.Session().run()이 실행되어야 변수는 실제로 값을 갖게 되고 함수는 실행이 된다. 


변수 print하는 것은 아래와 같다.

# source code


# result

[ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]


변수 print하는 부분에서 중요한 것은 tf.initialize_all_variables()이다. 변수를 초기화하겠다는 것이다. tf.Variable()을 통해서 변수를 선언하면 그 변수는 반드시 initialize된 후에 tf.Session().run()을 통해 실제 값을 가져야 한다. 즉 위의 코드에서 9번줄이 빠지면 에러가 난다. 반드시 initialize이후에 run()해줘야 된다.


마지막으로 placeholder를 봐보자.

# source code


# result 

[[2 3 4]

 [5 6 7]]


위의 예제에서 phd_f = phd_x + 1이라고 해뒀고, phd_x는 shape이 (2, 3)인 matrix가 되겠다. 즉 shape이 (2, 3)인 phd_x matrix의 각각 요소에 1을 더한것을 phd_f로 하겠다는 것이다.


phd_f라는 식을 세웠으니 tf.Session().run()으로 돌려보자. 다시 한번 말하지만, Tensorflow에서 모든 것은 tf.Session().run()을 통해서 실제로 수행될 수 있다. phd_f를 돌려서 값을 구하려고 보니, 아직 phd_x가 없다. 그래서 feed해주는 것이다. 무슨 형태로? dictionary형태로.


phd_x에 feed된 [[1, 2, 3], [4, 5, 6]]은 (2, 3) matrix이다. 이건 당연히 5번째 줄에서 선언한 그대로여야 한다. 다르면 에러난다.


여기까지가 아주아주아주 기본적인 Tensorflow의 변수선언 부분이다. 다음 포스팅에서는 Tensorflow를 이용해서 Linear Regression을 구현해보려고 한다.