TensorFlow 첫 사용기 (Linear Regression)

출처: https://cdn-images-1.medium.com/max/1600/0*LDGNE2IRJOFFcJ3s.png


'밑바닥부터 시작하는 딥러닝'을 읽고, 충분히 머신러닝에 빠진 것 같다.

이제 라이브러리를 활용해볼 줄 알아야할 것 같아서, TensorFlow를 공부하게 되었다.






가장 먼저, TensorFlow의 기본적인 개념은
(https://gist.github.com/haje01/202ac276bace4b25dd3f 를 참조)

텐서플로우(TensorFlow)는 기계 학습과 딥러닝을 위해 구글에서 만든 오픈소스 라이브러리입니다. 데이터 플로우 그래프(Data Flow Graph) 방식을 사용하였습니다.
데이터 플로우 그래프는 수학 계산과 데이터의 흐름을 노드(Node)와 엣지(Edge)를 사용한 방향 그래프(Directed Graph)로 표현합니다.

용어

 오퍼레이션(Operation)

 그래프 상의 노드는 오퍼레이션(줄임말 op)으로 불립니다. 오퍼레이션은 하나 이상의 텐서를 받을 수 있습니다. 오퍼레이션은 계산을 수행하고, 결과를 하나 이상의 텐서로 반환할 수 있습니다.

 텐서(Tensor)

 내부적으로 모든 데이터는 텐서를 통해 표현됩니다. 텐서는 일종의 다차원 배열인데, 그래프 내의 오퍼레이션 간에는 텐서만이 전달됩니다. (Caffe의 Blob과 유사합니다.)

 세션(Session)

 그래프를 실행하기 위해서는 세션 객체가 필요합니다. 세션은 오퍼레이션의 실행 환경을 캡슐화한 것입니다.

 변수(Variables)

 변수는 그래프의 실행시, 패러미터를 저장하고 갱신하는데 사용됩니다. 메모리 상에서 텐서를 저장하는 버퍼 역할을 합니다.



 손으로 직접 구현한 신경망과는 달리 텐서플로우는 낯설고 모호한 개념을 갖고 있었다. 익숙해지도록 노력해야겠다.



 가장 먼저,

Linear Regression(선형 회귀)

: y=ax+b같은 선형그래프로 정의될 수 있는 회귀선을 찾는 것이라 한다. 간단하게, y=ax+b에서 새로운 데이터가 들어왔을 때 어떤 '값'이 될지 예측하는 문제를 말한다.

를 구현해보려고 한다.

Inflearn에서 참고하였고, 파이썬3에서 tensorflow-gpu를 깔고, 콘솔에서 작성했다^^


>>> import tensorflow as tf  # 텐서플로우 Import
>>>
>>> W = tf.Variable(tf.random_normal([1]), name = 'weight')  # y=Wx+b에서 W를 Variable로 정의!
>>> b = tf.Variable(tf.random_normal([1]), name = 'bias')  # y=Wx+b에서 b를 Variable로 정의!
>>> X = tf.placeholder(tf.float32, shape=[None])  
>>> Y = tf.placeholder(tf.float32, shape=[None])  # X와 Y값(데이터셋)을 나중에 입력해주기 위한 그릇.
>>>
>>> hypo = X * W + b  # Hypothesis(추론)의 줄임말로, Wx+b를 통해 y를 구하는 (추론)함수를 정의
>>> cost = tf.reduce_mean(tf.square(hypo - Y))  # cost function(loss function)을 정의(평균제곱오차)
>>> optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01)  # 학습을 위해 매개변수 최적화를 해주는 객체 정의.
>>> train = optimizer.minimize(cost)  # train에게 cost(비용함수)의 값을 최소화시키기 위한 optimizer를 정의
>>>
>>> sess=  tf.Session()  # 그래프 실행을 위한 세션 객체
>>> sess.run(tf.global_variables_initializer())  # 변수들을 초기화
>>>
>>> for step in range(2001):  # 2001번 반복
...     cost_val, W_val, b_val, _ = \
...             sess.run([cost, W, b, train], feed_dict = {X: [1,2,3,4,5], Y: [15, 25, 35, 45, 55]})  # X와 Y를 y=10x+ 5라는 식(선형)으로 데이터셋을 만들어준다. 또한 train이 실행되면서 cost function값을 최소화시키기 위해 매개변수가 갱신됨
...     if step % 20 == 0:  # 20번마다 실행
...             print(step, cost_val, W_val, b_val)  # "(몇번쨰) (비용함수값) (W값) (B값)
...
0 680.0407 [3.3604891] [0.5900612]
20 0.9200972 [10.58507] [2.759524]
40 0.79143137 [10.577421] [2.914749]
60 0.69116193 [10.539743] [3.0513523]
80 0.6035953 [10.504396] [3.1789715]
100 0.5271261 [10.471362] [3.2982318]
120 0.46034303 [10.440493] [3.4096818]
140 0.40202045 [10.411645] [3.5138328]
160 0.35108763 [10.3846855] [3.6111631]
180 0.30660754 [10.359492] [3.7021189]
200 0.26776233 [10.33595] [3.787118]
220 0.23383932 [10.313947] [3.86655]
240 0.20421357 [10.293386] [3.9407814]
260 0.17834122 [10.274173] [4.010151]
280 0.15574668 [10.256217] [4.0749774]
300 0.13601485 [10.239436] [4.135557]
(중략)...
1800 5.276671e-06 [10.0014925] [4.9946146]
1820 4.614421e-06 [10.001395] [4.9949665]
1840 4.0275345e-06 [10.001303] [4.9952965]
1860 3.5171456e-06 [10.001218] [4.9956045]
1880 3.074984e-06 [10.00114] [4.995891]
1900 2.6854345e-06 [10.001063] [4.996159]
1920 2.3426926e-06 [10.000994] [4.9964113]
1940 2.0496204e-06 [10.00093] [4.996646]
1960 1.7900602e-06 [10.00087] [4.9968643]
1980 1.5642102e-06 [10.000813] [4.9970684]
2000 1.3666853e-06 [10.000758] [4.9972606]



언제나 봐도 아름답다.

내가 준 데이터셋만 보고 매개변수 W, b가 10, 5로 갱신되었다.


계속해서 배워보자~!

댓글