MNIST Data Set Softmax Regression - Part 2



Tutorial menggunakan MNIST data set sangat umum, biasanya dimulai dengan menggunakan softmax regression, baru kemudian dibahas menggunakan convolutional neural network. Pada catatan ini akan dibahas terlebih dahulu menggunakan softmax regression.

Softmax regression mengembali list value  antara 0 dan 1 yang bila dijumlahkan akan bernilai 1. Jadi dapat kita gunakan sebagai list of probability.

Jadi untuk data MNIST, kita memiliki 10 label (dari 0 - 9), ketika menggunakan softmax, kita mendapatkan 10 probability. Jika kita jumlahkan semua probability maka nilai nya adalah 1.

Jadi kita akan memilih label dengan probability terbesar, karena kemungkinannya paling benar. Pada prakteknya nanti, jarang kita mendapatkan 100% probability dari suatu labels.

Softmax function ini akan kita gunakan pada activation function model kita.



Equation diatas kita vectorize menjadi matrix multiplication dan addition, dimana lebih efisien.




import tensorflow as tf
import matplotlib.pyplot as plt
%matplotlib inline

from tensorflow.examples.tutorials.mnist import input_data

mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)

#placeholder (variable untuk image data training)
x = tf.placeholder(tf.float32, shape=[None, 784])

#variable weight: ada 10 label (0-9) dan setiap label sizenya 784 (28 * 28 pixels)
#variable bias: ada 10 label (0-9)
#init menggunakan tf.zeros untuk simplicity tutorial saja, sebetulnya tidak dianjurkan
W = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))

#graph operation
y = tf.matmul(x, W) + b

#loss function
y_true = tf.placeholder(tf.float32, shape=[None, 10])

cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_true, logits=y))

#optimize
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.5)
train = optimizer.minimize(cross_entropy)

#create session
init = tf.global_variables_initializer()

with tf.Session() as sess:
    sess.run(init)
    
    for step in range(1000):
        #note: pada dataset lain tidak dapat dilakukan 
        #kemudahan pemisahan batch seperti dibawah
        batch_x, batch_y = mnist.train.next_batch(100)
        sess.run(train, feed_dict={x:batch_x, y_true:batch_y})
        
    #evaluate model, membandingkan y hasil training dengan y_true. 
    #argmax akan mengambil nilai paling tinggi.

    correct_pred = tf.equal(tf.argmax(y,1), tf.argmax(y_true,1))
    
    acc = tf.reduce_mean(tf.cast(correct_pred, tf.float32))
    
    #keterangan dari 2 baris code diatas, contoh prediksi 2 data saja
    #tf.argmax : prediksi: [3,4] true: [3, 9] => contoh saja
    #tf.equal : [True, False]
    #tf.cast : [1.0, 0.0]
    #reduce_mean : 0.5 (1+5 / 2)
    
    print(sess.run(acc, feed_dict={x:mnist.test.images, y_true:mnist.test.labels}))


Catatan:
Hal yang akan cukup membingungkan adalah menentukan shape dari placeholder dan variable, karena itu perlu memahami bentuk data MNIST dengan baik.
MNIST Data Set Softmax Regression - Part 2 MNIST Data Set Softmax Regression - Part 2 Reviewed by noname needed on May 21, 2018 Rating: 5

No comments:

Powered by Blogger.