본문 바로가기

파이썬/머신러닝

[#E3]Linear Regression 데이터를 유동적으로 지정하는 방법


[#E2 : 머신러닝의 첫 단계 Linear Regression이란?] 에서는 x_train = [1,2,3], y_train = [1,2,3] 으로 데이터가 미리 지정되어 있었고, 이것을 바로 hypothesis 함수에 대입하여 제한된 결과를 도출했습니다.


1
2
x_train = tf.placeholder(tf.float32shape=[None])
y_train = tf.placeholder(tf.float32shape=[None])
cs



위의 코드에서 x_train, y_train은 사용자가 입력하는 유동적인 데이터를 나타냅니다. tf.float32는 데이터의 형식, shape는 데이터의 구조를 나타냅니다.

None이라는 뜻은 제공받은 데이터의 구조를 신경쓰지 않겠다는 뜻으로, 추후에 상세하게 다루겠습니다.


1
2
3
4
5
6
for step in range(2001):
    cost_val, w_val, b_val, _ = sess.run([cost, w, b, train],
                         feed_dict={x_train: [1, 2, 3, 4, 5],
                            y_train: [2.1, 3.1, 4.1, 5.1, 6.1]})
    if step % 20 == 0:
        print(step, cost_val, w_val, b_val)
cs


이후의 과정은 이전과 같으며, 유일하게 다른 점은 학습을 시작하면서 직접 데이터를 제공해야 한다는 점입니다.

즉, 사용자가 직접 feed_dict 에서 x_train = [1, 2, 3, 4, 5] , y_train = [2.1, 3.1, 4.1, 5.1, 6.1] 데이터를 제공합니다.


위의 코드는 2001번의 학습에서 cost_val, w_val, b_val 변수에 회차별로 발생하는 cost, w 변수, b 변수를 입력받으며 train을 진행합니다.


동시에 출력의 효율성을 위해 회차가 20배수일때만 결과를 출력합니다.



SOURCE CODE


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
x_train = tf.placeholder(tf.float32, shape=[None])
y_train = tf.placeholder(tf.float32, shape=[None])
 
= tf.Variable(tf.random_normal([1]), name="weight")
= tf.Variable(tf.random_normal([1]), name="bias")
 
hypothesis = W * x_train + b
 
cost = tf.reduce_mean(tf.square(hypothesis - y_train))
 
optimizer = tf.train.GradientDescentOptimizer(learning_rate = 0.01)
train = optimizer.minimize(cost)
 
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_train: [1,2,3,4,5],
                            y_train: [2.1,3.1,4.1,5.1,6.1]})
    if step % 20 == 0:
        print(step, cost_val, w_val, b_val)
 
`cs



[RESULT]


1
2
3
1960 2.6277302e-08 [0.99989504] [1.1003786]
1980 2.2997586e-08 [0.99990195] [1.1003541]
2000 2.0044912e-08 [0.9999084] [1.1003307]
cs


결과에서 최종적으로 W = 1, b = 1.1가 구해졌으며, Hypothesis = (W*x+b) 1*x+1.1 의 형태가 됩니다. 이는 우리가 제공한 데이터와 일치합니다.


데이터가 (x = 1, y = 2.1) 일 때 Hypothesis 에 의해 정확한 값이 구해지는 것을 알 수 있습니다.



테스트


1
print(sess.run(hypothesis, feed_dict={x_train:[5]}))
cs

1
[6.0998726]
cs


Hypothesis가 잘 작동하는 것을 알 수 있습니다.