세션이 살아있는 동안 계속해서 새로운 데이터를 학습할 수 있는 Online learning을 위한 기본이 되는 Batch만들기를 텐서플로우를 이용해 만들어봤다.
아래는 전체 소스 코드이다.
=========================== Python ===========================
import tensorflow as tf
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import random
nb_classes = 10
X = tf.placeholder(tf.float32, shape=[None, 784])
Y = tf.placeholder(tf.float32, shape=[None, nb_classes])
W = tf.Variable(tf.random_normal([784, nb_classes]), name='weight')
b = tf.Variable(tf.random_normal([nb_classes]), name='bias')
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
logits = tf.matmul(X, W) + b
hypothesis = tf.nn.softmax(logits)
cost = tf.reduce_mean(-tf.reduce_sum(Y * tf.log(hypothesis)))
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.002).minimize(cost)
is_correct = tf.equal(tf.argmax(hypothesis, 1), tf.argmax(Y, 1))
accuracy = tf.reduce_mean(tf.cast(is_correct, tf.float32))
training_epochs = 15
batch_size = 100
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for epoch in range(training_epochs):
avg_cost = 0
total_batch = int(mnist.train.num_examples / batch_size)
for i in range(total_batch):
batch_xs, batch_ys = mnist.train.next_batch(100) # 100개의 x,y가 읽어진다.
c, _ = sess.run([cost,optimizer], feed_dict={X:batch_xs, Y:batch_ys})
avg_cost += c/total_batch
print('epoch:', '%04d' %(epoch+1), 'cost = ', '{:.9f}'.format(avg_cost))
print('Accuracy: ', accuracy.eval(session=sess, feed_dict={X:mnist.test.images, Y:mnist.test.labels}))
r = random.randint(0, mnist.test.num_examples -1)
print("label:", sess.run(tf.argmax(mnist.test.labels[r:r+1],1)))
print("prediction:", sess.run(tf.argmax(hypothesis, 1), feed_dict={X:mnist.test.images[r:r+1]}))
plt.imshow(mnist.test.images[r:r+1].reshape(28,28), cmap="Greys", interpolation='nearest')
plt.show()
=========================== Python ===========================
결과는 아래와 같다.
epoch: 0015 cost = 0.746036197
Accuracy: 0.9021
label: [7]
prediction: [7]
결과는 좋게 나왔지만 Cost값이 너무 높게 나왔다.
소프트맥스를 이용했으므로 cross-entropy loss를 이용해서 cost 값을 구하는데 이는 아래와 같다.
H(P,Q)=−(1/m)∑xP(x)logQ(x)
이를 바탕으로 생각해보면 전체 평균이 0.7이고 P(x)는 항상 1인 것만 남으므로 -logQ(x)의 값이 0.7이라는 것을 알 수 있는데 이는 Q(x)가 약 0.2라는 뜻이다.
저기서 Q(x)가 소프트맥스라는 것을 생각하면 정답을 0.2로 맞춘다는 뜻이고 이것은 나머지 0.8을 9개가 나눠 갖는다는 것을 생각하면 충분한 확률이 아니라는 것을 알 수 있다.
어쨌든 간단한 모델로 꽤나 정확한 결과를 얻을 수 있다는 점에서는 유용하다고 할 수 있다.
ref.
인프런 / 모두를 위한 딥러닝 - 기본적인 머신러닝과 딥러닝 강좌
'데이터 분석 > 데이터 분석 기초 자료' 카테고리의 다른 글
[TensorFlow] TensorFlow 기초 (0) | 2018.07.23 |
---|---|
[알고리즘]랜덤포레스트(RandomForest) (0) | 2018.07.21 |
[데이터 수집] 파이썬으로 API를 이용하여 JSON 형태의 영화 데이터 수집하기 (0) | 2018.07.04 |
[Python Scraping] HTML에 존재하는 전체 데이터를 재귀적으로 가져오기 (0) | 2018.07.03 |
[Tensorflow] AVX 미지원으로 인한 "DLL 초기화 루틴을 실행할 수 없습니다." 에러 해결방법 (1) | 2018.06.29 |