우선 이론 시간에 이야기했던 것처럼 x의 데이터가 3개가 있는데 마지막 값이 얼마 일까?라는 모델을 만들어 볼 것이다.
x의 data가 많으면 예측하는 값도 더 정확할 것이다. 그러면 어떻게 하면 좋을까? 일단 H(x)를 tensor flow로 표현해보자
H(x1, x2, x3) = x1 w1 +x 2 w2 +x 3 w3 |
우리가 이론 시간에 배운 matrix이다. 이제 코드를 확인해보자.
x1_data = [73., 93., 89., 96., 73.]
x2_data = [80., 88., 91., 98., 66.]
x3_data = [75., 93., 90., 100., 70.]
y_data = [152., 185., 180., 196., 142.]
# placeholders for a tensor that will be always fed.
x1 = tf.placeholder(tf.float32)
x2 = tf.placeholder(tf.float32)
x3 = tf.placeholder(tf.float32)
Y = tf.placeholder(tf.float32)
w1 = tf.Variable(tf.random_normal([1]), name='weight1')
w2 = tf.Variable(tf.random_normal([1]), name='weight2')
w3 = tf.Variable(tf.random_normal([1]), name='weight3')
b = tf.Variable(tf.random_normal([1]), name='bias')
hypothesis = x1 * w1 + x2 * w2 + x3 * w3 + b
x의 data를 입력하고 feed_dict로 던져주기 위해 placeholder을 만들었다. 그런 다음에 w은 각각 하나의 값이기 때문에 [1]로 준다. hyporthesis는 위공식처럼 그대로 써준다. hyporthesis가 있으면 Cost는 우리의 값과 y의 값을 차의 제곱을 평균 낸 것으로 해준다.
cost = tf.reduce_mean(tf.square(hypothesis - Y))
# Minimize. Need a very small learning rate for this data set
optimizer = tf.train.GradientDescentOptimizer(learning_rate=1e-5)
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())
for step in range(2001):
cost_val, hy_val, _ = sess.run([cost, hypothesis, train],
feed_dict={x1: x1_data, x2: x2_data, x3: x3_data, Y: y_data})
if step % 10 == 0:
print(step, "Cost: ", cost_val, "\nPrediction:\n", hy_val)
이전과 똑같이 optimizer은 GradientDescenr알고리즘을 써주었다. 학습하는 방법은 이전까지의 방법과 거의 유사하다.
'''
0 Cost: 19614.8
Prediction:
[ 21.69748688 39.10213089 31.82624626 35.14236832 32.55316544]
10 Cost: 14.0682
Prediction:
[ 145.56100464 187.94958496 178.50236511 194.86721802 146.08096313]
...
1990 Cost: 4.9197
Prediction:
[ 148.15084839 186.88632202 179.6293335 195.81796265 144.46044922]
2000 Cost: 4.89449
Prediction:
[ 148.15931702 186.8805542 179.63194275 195.81971741 144.45298767]
'''
위는 출력 값이다 처음에는 Cost의 값이 매우 크다가 학습할수록 낮아졌고 prediction을 보면 우리의 원래 y값과는 같지 않지만 거의 비슷해졌다.
일단 이 코드는 좀 복잡하다. x의 data 만약 100개라 하면 데이터를 x100까지 우리는 코드 하나하나 입력해야 될 것이다. w100까지 입력해야 한다. 이렇게 되면 굉장히 스파게티 코드가 된다. 그래서 이런 코드는 사용하지 않는다
이때 이것을 대체할 것이 바로 matrix이다. 전 시간에 배운 것을 복습해보자.

x의 개수가 얼마인지 상관없이 옆으로 나열해주고 그 개수의 맞게 w를 나열해주면 한 번에 다 곱해서 더해준다.
이것을 구현해보면 아래의 코드처럼 된다.
x_data = [[73., 80., 75.], [93., 88., 93.],
[89., 91., 90.], [96., 98., 100.],[73., 66., 70.]]
y_data = [[152.],[185.],[180.],[196.],[142.]]
# placeholders for a tensor that will be always fed.
X = tf.placeholder(tf.float32, shape=[None, 3])
Y = tf.placeholder(tf.float32, shape=[None, 1])
W = tf.Variable(tf.random_normal([3, 1]), name='weight')
b = tf.Variable(tf.random_normal([1]), name='bias')
# Hypothesis
hypothesis = tf.matmul(X, W) + b
하나의 xdata를 쭉 써주고 ydata를 써줬다. 그다음 우리는 placeholder을 만들어야 대는데 주의할 것을 shape이다. 여기는 3개의 xdata가 들어가서 [?, 3]으로 써줬고 None이 의미하는 것은 지금은 5개의 xdata가 있지만 우리가 필요에 따라 추가할 필요가 있기 때문에 None이라고 해준다 우리가 원하는 만큼 추가할 수 있다. y는 우리가 최종으로 원하는 것은 1개의 값이기 때문에 [None,1]이라고 했다. 나머지 학습하는 모든 과정은 똑같다. 이것이 matrix의 가장 큰 장점이다.
matrix를 사용하게 되면 vatiable의 개수의 상관없이 굉장히 쉽게 구현할 수 있다.
공부한 사이트:https://www.youtube.com/watch?v=fZUV3xjoZSM&list=PLlMkM4tgfjnLSOjrEJN31gZATbcj_MpUm&index=9
'머신러닝 > 모두를 위한 딥러닝' 카테고리의 다른 글
Logistic Classification의 가설 함수 정의 (0) | 2019.05.19 |
---|---|
TensorFlow로 파일에서 data읽어오기 (0) | 2019.05.18 |
multi-variable linear regression (0) | 2019.05.15 |
Linear Regression 의 cost 최소화의 TensorFlow 구현 (0) | 2019.05.14 |
Linear Regression의 cost 최소화 알고리즘의 원리 (0) | 2019.05.13 |