-
Multi-variable
- 텐서플로우에서 여러개의 변수를 사용하는 것도 기존의 1개의 변수를 사용하여 학습한 것과 똑같다. hypothesis식 H(a)= Wa+u에서 변수의 개수만 늘려 다음처럼 표시하면 되는 것이다.
cost 역시 위에서 구한 H(a,b,c)-y 제곱의 평균이므로 이전과 다를게 없이 구할 수 있다.
"변수가 3개인 학습"
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.]
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]))
w2 = tf.Variable(tf.random_normal([1]))
w3 = tf.Variable(tf.random_normal([1]))
b = tf.Variable(tf.random_normal([1]))
hypothesis = x1 * w1 + x2*w2 + x3*w3+b
cost = tf.reduce_mean(tf.square(hypothesis - y))
optimizer = tf.train.GradientDescentOptimizer(learning_rate = 1e-5)
train = optimizer.minimize(cost)
sess = tf.Session()
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 % 20 ==0:
print(step, "cost : ", cost_val, "hypothesis : ", hy_val)
위 코드에서 처럼 변수를 늘리고 hypothesis = x1 * w1 + x2*w2 + x3*w3+b 으로 식을 만들면 된다.
하지만 이 변수의 개수가 무수히 많을 때는 비효율적이고, 코드가 깔끔하지 못할 것이다. 이럴 때 matrix를 이용하면 간단하게 변수가 여러개인 학습을 처리할 수 있다.
-
Matrix
- matrix의 곱을 이용하면 여러 변수가 존재할 때 간단히 hypothesis를 표현할 수 있다. 아래 식처럼 단순히 W matrix와 데이터 matrix를 곱하기만 하면 된다.
- 또한 matrix를 사용하면 여러 변수가 존재하는 다수의 데이터를 처리하기도 유리하다. 인스턴스가 몇 개인지에 상관없이 W matrix는 그대로 두고 기존의 데이터 matrix에 행만 늘리면 쉽게 다수의 데이터를 처리할 수 있는 것이다.
- 이제 matrix만 이용한다면 hypothesis는 간단히 다음처럼 표현할 수 있는 것이다.
-
example
- 위 코드를 matrix를 이용하면 다음과 같다.
"matrix"
### 1) matrix
x_matrix = [[73. , 80. , 75.], [93. , 88., 93.], [89., 91.,90.], [96.,98.,100.],[73.,66.,72.]]
y_matrix = [[152.],[185.],[180.],[196.],[142]]
X = tf.placeholder(tf.float32, shape =[None, 3]) ### 2-1) shape / variable count
Y = tf.placeholder(tf.float32, shape =[None, 1])
W = tf.Variable(tf.random_normal([3,1])) ### 2-2)
b = tf.Variable(tf.random_normal([1]))
hypothesis = tf.matmul(X,W)+b ### 3) matmul / matrix multiply
cost = tf.reduce_mean(tf.square(hypothesis - Y))
optimizer = tf.train.GradientDescentOptimizer(learning_rate = 1e-5)
train = optimizer.minimize(cost)
sess = tf.Session()
sess.run(tf.global_variables_initializer())
for step in range(2001):
cost_val , hy_val, _ = sess.run([cost, hypothesis, train], feed_dict={X: x_matrix , Y: y_matrix})
if step % 20 ==0:
print(step, "cost : ", cost_val, "hypothesis : ", hy_val)
- 위 코드에서 확인해야할 포인트는 표시한 3부분이다.
1) 인스턴스를 여러 배열 변수를 두었던 x 데이터를 인스턴스별로 matrix로 만들어 x_matrix, y_matrix로 간단하게 선언하였다.
2) 학습용 placeholder는 행렬의 크기를 먼저 정해주어야한다.
3) matrix 곱셈은 tf.matmul()로 처리한다.