티스토리 뷰
Tensorflow로 Fancy Softmax Clasification 구현
1. Softmax_cross_entropy_with_logits
이 함수를 사용하면 굉장히 깔끔하게 만들수 있는데 마지막에 항상 logit을 넘겨준다는 겻을 기억할 것.
logits = tf.matmul(X, W) + b
hypothesis = tf.nn.softmax(logits)
In [ ]:
# Cross entropy cost/loss
cost = tf.reduce_mean(-tf.reduce_sum(Y * tf.log(hypothesis), axis=1))
# Y 는 one hot으로 주어짐
In [ ]:
# Cross entropy cost/loss
cost_i = tf.nn.softmax_cross_entropy_with_logits(logitx=logitx,
labels=Y_one_hot)
cost = tf.reduce_mean(cost_i)
2. Animal Classification
with softmax_cross_entropy_with_logits
In [3]:
import numpy as np
import tensorflow as tf
3. tf.one_hot and reshape
In [ ]:
Y = tf.placeholder(tf.int32, [None, 1]) # 0~6, shape=(?,1)
Y_one_hot = tf.one_hot(Y, nb_classes) # one hot shape=(?, 1, 7)
Y_one_hot = tf.reshape(Y_one_hot, [-1, nb_classes]) # shape=(?, 7)
3번째 줄을 안쓰면 오류가 뜬다.
이유는 one_hot은 만약에 rank가 N이면 그 output은 N+1이 되기 때문이다.
ex)
[[0],[3]] -> [[[1,0,0,0,0,0,0],[0,0,0,1,0,0,0]]]
reshape을 사용하여 원하는 형태로 바꿔줘야 한다
구현
In [8]:
# Predicting animal type based on various features
xy = np.loadtxt('data-04-zoo.csv', delimiter=',', dtype=np.float32)
x_data = xy[:, 0:-1]
y_data = xy[:, [-1]]
nb_classes = 7 # 0 ~ 6
X = tf.placeholder(tf.float32, [None, 16])
Y = tf.placeholder(tf.int32, [None, 1]) # 0 ~ 6
Y_one_hot = tf.one_hot(Y, nb_classes) # one hot
Y_one_hot = tf.reshape(Y_one_hot, [-1, nb_classes])
W = tf.Variable(tf.random_normal([16, nb_classes]), name='weight')
b = tf.Variable(tf.random_normal([nb_classes]), name='bias')
# tf.nn.softmax computes softmax activations
# softmax = exp(logits) / reduce_sum(exp(logits), dim)
logits = tf.matmul(X, W) + b
hypothesis = tf.nn.softmax(logits)
# Cross entropy cost/loss
cost_i = tf.nn.softmax_cross_entropy_with_logits(logits=logits,
labels=Y_one_hot)
cost = tf.reduce_mean(cost_i)
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.1).minimize(cost)
#학습
cost = tf.reduce_mean(cost_i)
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.1).minimize(cost)
prediction = tf.argmax(hypothesis, 1)
correct_prediction = tf.equal(prediction, tf.argmax(Y_one_hot, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
# Launch graph
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for step in range(2000):
sess.run(optimizer, feed_dict={X: x_data, Y: y_data})
if step % 100 == 0:
loss, acc = sess.run([cost, accuracy], feed_dict={
X: x_data, Y: y_data})
print("Step: {:5}\tLoss: {:.3f}\tAcc: {:.2%}".format(
step, loss, acc))
# Let's see if we can predict
pred = sess.run(prediction, feed_dict={X: x_data})
# y_data.flatten() : 다차원 배열을 1차원 배열로 쭉 펴준다.
# y_data: (N, 1) = flatten -> (N, ) matches pred.shape
for p, y in zip (pred, y_data.flatten()):
print("[{}] Prediction: {} True Y: {}".format(p == int(y), p, int(y)))
# zip : pred와 y_data.flatten() 2개의 배열을 하나로 묶어서 p, y로 넘겨줌
'beginner > 파이썬 딥러닝 기초' 카테고리의 다른 글
Training/Testing 데이터 셋 이론 (0) | 2019.05.05 |
---|---|
학습 rate, Overfitting, 그리고 일반화(Regularization) 이론 (0) | 2019.05.05 |
Tensorflow로 Softmax Classification의 구현하기 (0) | 2019.05.05 |
Softmax Regression 이론 (0) | 2019.05.05 |
Logistic Classification 이론 (0) | 2019.05.05 |