๊ธ€ ์ž‘์„ฑ์ž: ๋˜ฅํด๋ฒ .
๋ฐ˜์‘ํ˜•

๋ชฉ์ฐจ


  • Build graph using TensorFlow operations
  • Place holders

 

Build graph using TensorFlow operations


[๊ทธ๋ฆผ1] Hyphothesis & Cost function
[๊ทธ๋ฆผ2] TensorFlow Mechanics

 Linear regression์„ ๊ตฌํ˜„ํ•˜์—ฌ ๊ทธ๋ž˜ํ”„๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์œ„์˜ ๊ทธ๋ฆผ์„ ๋ณด๋ฉด์„œ ์ง€๋‚œ ๋‚ด์šฉ์„ ๋ณต์Šตํ•˜๋„๋ก ํ•˜์ž.

Hypothesis์™€ Cost function์˜ ์‹์€ [๊ทธ๋ฆผ1]๊ณผ ๊ฐ™๊ณ ,  ํ…์„œํ”Œ๋กœ์šฐ์˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ [๊ทธ๋ฆผ 2]์™€ ๊ฐ™๋‹ค.

 

# X and Y data
x_train = [1, 2, 3]
y_train = [1, 2, 3]

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

# Our hyphothesis XW+b
hypothesis = x_train * W + b

Hypothesis๋ฅผ Python ์ฝ”๋“œ๋กœ ๋‚˜ํƒ€๋‚ด๋ฉด ์œ„์™€ ๊ฐ™๋‹ค.

x_train, y_train์€ ์šฐ๋ฆฌ๊ฐ€ ํ•™์Šตํ•  ๋ฐ์ดํ„ฐ์ธ training set์ด๊ณ ,

W์™€ b๋Š” tf.Variable๋กœ ๋‚˜ํƒ€๋ƒˆ๋Š”๋ฐ ๊ธฐ์กด์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ๋ณ€์ˆ˜์™€๋Š” ์กฐ๊ธˆ ๋‹ค๋ฅธ ๊ฐœ๋…์ด๋‹ค.

์‰ฝ๊ฒŒ ์ƒ๊ฐํ•ด์„œ ํ…์„œํ”Œ๋กœ์šฐ์—์„œ ์‚ฌ์šฉํ•˜๋Š” Variable, ์ฆ‰ ํ…์„œํ”Œ๋กœ์šฐ์—์„œ ์ž์ฒด์ ์œผ๋กœ ๋ณ€๊ฒฝ์‹œํ‚ค๋Š” ๊ฐ’(ํ•™์Šต์„ ์œ„ํ•ด์„œ)์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

์šฐ๋ฆฌ๋Š” W์™€ b์˜ ๊ฐ’์„ ๋ชจ๋ฅด๋‹ˆ๊น tf.random_normal๋กœ ๋‚˜ํƒ€๋‚ด์—ˆ๊ณ  ๊ฐ’์ด ํ•˜๋‚˜์ธ 1์ฐจ์› ๋ฐฐ์—ด์ด๋ฏ€๋กœ [1](Shape)์„ ์ธ์ž๋กœ ์ฃผ์—ˆ๋‹ค.

 

cost = tf.reduce_mean(tf.square(hypothesis - y_train))

Cost function๋„ ์ฝ”๋“œ๋กœ ๋‚˜ํƒ€๋‚ด๋ฉด ์œ„์™€ ๊ฐ™๋‹ค tf.square์€ ๊ฐ’์„ ์ œ๊ณฑํ•ด์ฃผ๋Š” ํ•จ์ˆ˜, tf.reduce_mean๋Š” ๊ฐ’์„ ํ‰๊ท ๋‚ด์ฃผ๋Š” ํ•จ์ˆ˜๋‹ค.

# Minimize
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01)
train = optimizer.minimize(cost)

๊ทธ๋‹ค์Œ ์ž‘์—…์€ Cost๋ฅผ ์ตœ์†Œํ™”ํ•˜๋Š” ๊ฒƒ์ธ๋ฐ ์ฝ”๋“œ๋กœ ๋‚˜ํƒ€๋‚ด๋ฉด ์œ„์™€ ๊ฐ™๋‹ค.

์ €๋ ‡๊ฒŒ minimize ํ•˜๋ฉด ํ…์„œํ”Œ๋กœ์šฐ๊ฐ€ W์™€ b๋ฅผ ์กฐ์ ˆํ•˜๋ฉด์„œ Cost๋ฅผ ์ตœ์†Œํ™”์‹œ์ผœ์ค€๋‹ค. ์ง€๊ธˆ์€ ์ผ๋‹จ ํ†ต์œผ๋กœ ์™ธ์›Œ๋‘์ž!

 

# Launch the graph in a session.
sess = tf.Session()
# Initializes global variables in the graph
sess.run(tf.global_variables_initializer())

# Fit the line
for step in range(2001):
    sess.run(train)
    if step % 20 == 0:
        print(step, sess.run(cost), sess.run(W), sess.run(b))

๋‹ค์Œ์€ ์„ธ์…˜์„ ๋งŒ๋“ค์–ด์ฃผ๊ณ , ์šฐ๋ฆฌ๋Š” W์™€ b๋ผ๋Š” Variable์„ ๋งŒ๋“ค์—ˆ์œผ๋ฏ€๋กœ ๋ฐ˜๋“œ์‹œ tf.global_variables_initializer() ๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰์‹œ์ผœ์ฃผ์–ด์•ผ ํ•œ๋‹ค. (๊ทธ๋ž˜์•ผ์ง€ Variable๋ฅผ ์ธ์‹ํ•œ๋‹ค)

๊ทธ๋ฆฌ๊ณ  Cost๋ฅผ ์ตœ์†Œํ™” ์‹œ์ผœ์ฃผ๊ธฐ์œ„ํ•ด ์šฐ๋ฆฌ๋Š” train์ด๋ผ๋Š” node๋ฅผ ๋งŒ๋“ค์—ˆ์œผ๋ฏ€๋กœ ์„ธ์…˜์œผ๋กœ train์„ run ์‹œ์ผœ์•ผ ํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  20๋ฒˆ์— ํ•œ๋ฒˆ์”ฉ ๊ฒฐ๊ด๊ฐ’์„ ์ฐ์–ด๋ณด๋ฉด.. ์•„๋ž˜์™€ ๊ฐ™์ด ๋‚˜์˜จ๋‹ค.

[์ „์ฒด ์†Œ์Šค์ฝ”๋“œ]

import tensorflow as tf

# X and Y data
x_train = [1, 2, 3]
y_train = [1, 2, 3]

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

# Our hyphothesis XW+b
hypothesis = x_train * W + b

# cost/loss function
cost = tf.reduce_mean(tf.square(hypothesis - y_train))

# Minimize
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01)
train = optimizer.minimize(cost)

# Launch the graph in a session.
sess = tf.Session()
# Initializes global variables in the graph
sess.run(tf.global_variables_initializer())

# Fit the line
for step in range(2001):
    sess.run(train)
    if step % 20 == 0:
        print(step, sess.run(cost), sess.run(W), sess.run(b))
...
...
1800 6.571583e-06 [0.9970226] [0.00676825]
1820 5.9684476e-06 [0.9971626] [0.00645017]
1840 5.420529e-06 [0.9972959] [0.00614703]
1860 4.922903e-06 [0.997423] [0.00585814]
1880 4.4713174e-06 [0.9975441] [0.00558284]
1900 4.060744e-06 [0.9976595] [0.00532046]
1920 3.688065e-06 [0.9977695] [0.00507043]
1940 3.3496133e-06 [0.9978743] [0.00483215]
1960 3.0423025e-06 [0.9979742] [0.00460506]
1980 2.7630122e-06 [0.9980694] [0.00438865]
2000 2.5094093e-06 [0.9981602] [0.0041824]

๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด W๊ฐ€ 1, b๊ฐ€ 0์œผ๋กœ ๊ฐ€๊นŒ์›Œ์ง€๋Š” ํ˜•ํƒœ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

Place holders


์œ„์—์„œ๋Š” ์šฐ๋ฆฌ๊ฐ€ training set๋ฅผ (x_train, y_train) ๊ฐ๊ฐ ๊ณ ์ •ํ•ด์„œ ํ•™์Šต์‹œ์ผฐ์ง€๋งŒ, ์šฐ๋ฆฌ๊ฐ€ Place holder๋ฅผ ์ด์šฉํ•ด์„œ ์ž„์˜๋กœ ๊ฐ’์„ ์ •ํ•ด ์ค„ ์ˆ˜ ์žˆ๋‹ค.

# X and Y data
X = tf.placeholder(tf.float32, shape=[None])
Y = tf.placeholder(tf.float32, shape=[None])

์—ฌ๊ธฐ์„œ shape=[None]์€ 1์ฐจ์› ๋ฐฐ์—ด์ด๊ณ  ๊ฐ’์€ ์•„๋ฌด ๊ฐ’์ด๋‚˜ ๋“ค์–ด์˜ฌ ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•œ๋‹ค.

# Fit the line
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 % 20 == 0:
        print(step, cost_val, W_val, b_val)

์•ฝ๊ฐ„ ๋ณต์žกํ•ด๋ณด์ด์ง€๋งŒ, ์„ธ์…˜์„ run ์‹œํ‚ฌ ๋•Œ ์ผ์ผ์ด ์—ฌ๋Ÿฌ ๋ฒˆ run ์‹œํ‚ค๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ ์œ„์™€ ๊ฐ™์ด ํ•œ๋ฒˆ์— listํ˜•ํƒœ๋กœ ์ „๋‹ฌํ•˜์—ฌ run ์‹œํ‚ฌ ์ˆ˜๋„ ์žˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ Placeholders๋ฅผ ์‚ฌ์šฉํ–ˆ์œผ๋ฏ€๋กœ feed_dict๋ฅผ ํ†ตํ•ด X์™€ Y์˜ ๊ฐ’์„ ์ธ์ž๋กœ ๋„˜๊ฒจ์ฃผ๋ฉด ๋œ๋‹ค.

[์ „์ฒด ์†Œ์Šค์ฝ”๋“œ]

import tensorflow as tf

# X and Y data
X = tf.placeholder(tf.float32, shape=[None])
Y = tf.placeholder(tf.float32, shape=[None])

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

# Our hyphothesis XW+b
hypothesis = X * W + b

# cost/loss function
cost = tf.reduce_mean(tf.square(hypothesis - Y))

# Minimize
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01)
train = optimizer.minimize(cost)

# Launch the graph in a session.
sess = tf.Session()
# Initializes global variables in the graph
sess.run(tf.global_variables_initializer())

# Fit the line
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 % 20 == 0:
        print(step, cost_val, W_val, b_val)
...
...
1620 1.1853394e-05 [1.0022277] [1.0919573] None
1640 1.0352453e-05 [1.0020819] [1.092484] None
1660 9.040323e-06 [1.0019455] [1.0929762] None
1680 7.894941e-06 [1.0018181] [1.0934364] None
1700 6.8945096e-06 [1.001699] [1.0938662] None
1720 6.0213283e-06 [1.0015877] [1.0942678] None
1740 5.257885e-06 [1.0014838] [1.0946432] None
1760 4.592922e-06 [1.0013866] [1.0949937] None
1780 4.010986e-06 [1.0012959] [1.0953215] None
1800 3.5028606e-06 [1.0012109] [1.0956279] None
1820 3.0593212e-06 [1.0011318] [1.0959142] None
1840 2.6715702e-06 [1.0010576] [1.0961818] None
1860 2.3329264e-06 [1.0009884] [1.0964319] None
1880 2.0374566e-06 [1.0009236] [1.0966655] None
1900 1.7793939e-06 [1.0008631] [1.0968839] None
1920 1.5542213e-06 [1.0008067] [1.0970877] None
1940 1.3571125e-06 [1.0007539] [1.0972784] None
1960 1.1851548e-06 [1.0007045] [1.0974566] None
1980 1.0354879e-06 [1.0006584] [1.0976231] None
2000 9.042254e-07 [1.0006152] [1.0977786] None

 

์ฐธ๊ณ ์ž๋ฃŒ


https://www.youtube.com/watch?v=mQGwjrStQgg
Sung Kim- ML lab 02 TensorFlow๋กœ ๊ฐ„๋‹จํ•œ linear regression์„ ๊ตฌํ˜„
๋ฐ˜์‘ํ˜•