세션이 살아있는 동안 계속해서 새로운 데이터를 학습할 수 있는 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. 
인프런 / 모두를 위한 딥러닝 - 기본적인 머신러닝과 딥러닝 강좌


+ Recent posts