Training and Test datasets
X = tf.placeholder("float", [None, 3]);
Y = tf.placeholder("float", [None, 3]);
W = tf.Variable(tf.random_normal([3, 3]))
b = tf.Variable(tf.random_normal([3]))
hypothesis = tf.nn.softmax(tf.matmul(X, W) + b)
cost = tf.reduce_mean(-tf.reduce_sum(Y * tf.log(hypothesis), axis=1))
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.1).minimize(cost)
# Correct prediction Test model
prediction = tf.arg_max(hypothesis, 1)
is_correct = tf.equal(prediction, tf.arg_max(Y, 1))
accuracy = tf.reduce_mean(tf.cast(is_correct, tf.float32))
# Launch graph
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for step in range(201):
cost_val, W_val, _ = sess.run([cost, W, optimizer], feed_dict={X: x_data, Y: y_data}) # Use training data(x_data,
#y_data)
print(step, cost_val, W_val)
#predict
print("Prediction: ", sess.run(prediction, feed_dict={X: x_test})
#Calculate the accuracyh
print("Accuracy: ", sess.run(accuracy, feed_dict={X: x_test, Y: y_test})
Learning rate
값이 너무 크면 스텝이 너무 커져서 학습이 잘 되지 않는다. 반대로 값이 너무 작으면 학습이 굉장히 더디게 일어나고, local minima에 빠질 수 있다.(Overfitting).
Learning rate이 너무 클 때의 결과(learning_rate=1.5)
너무 작을 때의 결과(1e-10) .. 수백번을 해도 cost가 변하지 않고 있음
Non-normalized inputs : 이럴 경우에도 NaN이 발생할 수 있다. 아래 데이터 중 제일 뒤에있는게 Y데이터고 그 전에 것들이 X데이터이다.
xy = ...
x_data = xy[:, 0:-1]
y_data = xy[:, [-1]]
X = tf.placeholder(tf.float32, shape=[None, 4])
Y = tf.placeholder(tf.float32, shape=[None, 1])
W = tf.Variable(tf.random_normal([4, 1]), name='weight')
b = tf.Variable(tf.random_normal([1]), name='bias')
hypothesis = tf.matmul(X, W) + b
cost = tf.reduce_mean(tf.square(hypothesis - Y))
#Minimize
optimizer = tf.rain.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_data, Y: y_data})
print(step, "Cost: ", cost_val, "\nPrediction:\n", hy_val)
Normalize 하는 법 : 제일 작은값을 0, 제일 큰값을 1 로 해서 Normalize 한다.(데이터가 크거나 데이터의 차이가 들쑥날쑥하면 Normalize를 하는 것이 좋다.)