딥러닝(텐서플로우): 간단한 선형 회귀 placeholder를 이용하여 구현

Posted by 드린
2017. 5. 14. 08:00 IT

baegui-MacBook-Pro:~ baeg$ python3

Python 3.6.1 (v3.6.1:69c0db5050, Mar 21 2017, 01:21:04) 

[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin

Type "help", "copyright", "credits" or "license" for more information.

>>> import tensorflow as tf


저번 시간에는 X_train과 Y_train이라는 배열을 통해 입력해주었는데요.
이번 시간에는 placeholder를 이용해서 그때 그때 입력하는 방법으로 구현해볼거예요.


>>> w=tf.Variable(tf.random_normal([1]), name='weight')

>>> b=tf.Variable(tf.random_normal([1]), name='bias')

>>> X=tf.placeholder(tf.float32, shape=[None])

>>> Y=tf.placeholder(tf.float32, shape=[None])

먼저 저번시간과 같이 Variable에 랜덤값을 넣어준, weight와 bias를 선언해줍니다.

그리고 placeholder를 float32타입의 배열이 아닌 값 형태로 변경해줍니다.


>>> hypothesis = X * W +b

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

NameError: name 'W' is not defined

그리고 hypothesis를 선언해주는데, 오류가 나왔네요.

알고보니 위에서 대문자 W가 아닌 소문자 w를 선언해주었기에 define오류가 나왔어요.

오타가 이렇게 무섭습니다. 여러분.


>>> hypothesis = X * w +b

>>> cost = tf.reduce_mean(tf.square(hypothesis-Y))

>>> optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01)

>>> train = optimizer.minimize(cost)

이번엔 제대로 된 hypothesis를 선언해주고,

cost function도 선언해주고,

학습 시간과 미니마이즈도 선언해줍니다.


>>> sess=tf.Session()

>>> sess.run(tf.global_variables_initializer())


저번 시간에 했던 내용이므로 넘어가겠습니다.


>>> for step in range(2001):

...         cost_val, W_val, b_val, _ =sess.run([cost, w, b, train],

...                 feed_dict={X: [1,2,3,4,5], Y:[2.1, 3.1, 4.1, 5.1, 6.1]})

...         if step % 100 ==0:

...                 print(step, cost_val, W_val, b_val)

... 

자 이제 실제 학습 시키는 부분인데요.

for문 다음으로 이상한 코드가 써져있죠?

이것은 세션에 cost, w, b, train을 실행시키는데, 그 결과값을 cost_val, W_val, b_val, _에 넣으라는 뜻이예요.

_(train)부분은 입력받을 필요가 없기때문에 그냥 임의로 지정해 놓은 것입니다.

그리고 placeholder로 선언하였으니 feed_dict로 x,y값을 입력합니다.

그리고 100번마다 값을 출력해줍니다.


0 6.17568 [ 0.42948502] [ 1.09415972]

100 0.00185961 [ 0.97209781] [ 1.20073557]

200 0.000944613 [ 0.98011369] [ 1.17179585]

300 0.000479848 [ 0.98582655] [ 1.15117085]

400 0.000243745 [ 0.98989832] [ 1.13647044]

500 0.000123815 [ 0.9928003] [ 1.12599313]

600 6.28904e-05 [ 0.9948687] [ 1.11852539]

700 3.19454e-05 [ 0.99634296] [ 1.11320305]

800 1.62281e-05 [ 0.99739355] [ 1.10941005]

900 8.24338e-06 [ 0.9981423] [ 1.10670674]

1000 4.18647e-06 [ 0.99867612] [ 1.1047796]

1100 2.1265e-06 [ 0.99905646] [ 1.10340631]

1200 1.08034e-06 [ 0.99932748] [ 1.10242784]

1300 5.48733e-07 [ 0.99952072] [ 1.10173035]

1400 2.78906e-07 [ 0.99965829] [ 1.10123348]

1500 1.41644e-07 [ 0.99975646] [ 1.10087931]

1600 7.21096e-08 [ 0.99982631] [ 1.10062695]

1700 3.6626e-08 [ 0.99987614] [ 1.10044682]

1800 1.86714e-08 [ 0.99991161] [ 1.10031903]

1900 9.47313e-09 [ 0.99993706] [ 1.10022724]

2000 4.8326e-09 [ 0.999955] [ 1.10016227]

그럼 위와같은 결과를 얻을 수 있어요.

w의 값은 0.9, b의 값은 1.1에 가까워지고 있군요.

이렇게 나온다면 정상적으로 학습이 된것입니다.

#딥러닝 #텐서플로우 #간단한 선형 회귀 #placeholder #feed_dict #오타

  1. 공감부터 누르고 댓글 답니다^^ 립러닝을 공부하시는 분들께 매우 유익한 정보인 것 같습니다.
    오늘도 좋은 하루되세요 드린님!
이 댓글을 비밀 댓글로