Easy NeuralNetwork with mnist (part 2 create model)

เมื่อเราเตรียมข้อมูลเสร็จแล้วก็จะมาเริ่มสร้าง โครงสร้างของ Neural Network กันนะครับ เริ่มจากสร้าง sequence ขึ้นมาก่อน บอกเป็นนัยว่ามันจะเป็น sequence นะ โดยโค้ดตัวอย่างเป็นด้านล่างครับ (ส่วน from import ต่างๆ จะปรับแล้วค่อยเอาไปไว้ด้านบนอีกทีครับ อยากให้เห็นส่วนที่เกี่ยวข้องในแต่ละส่วน)

from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Dropout
model = Sequential()
model.add(Dense(512, activation='sigmoid', input_shape=(784,)))
model.add(Dropout(0.2))
model.add(Dense(512, activation='sigmoid'))
model.add(Dropout(0.2))
model.add(Dense(10, activation='softmax'))
model.summary()

จากโค้ดเราบอกว่าเรากำลังจะสร้าง NeuralNet ขึ้นมาครับ โดยมี input_shape ขนาด 784 input จากรูปของเรา ส่งไปยัง node neural จำนวน 512 แต่ละ Node จะมี sigmoid เป็น activation function ตบท้ายด้วย dropout(0.2) และทำซ้ำเดิม อีก 1 ชั้น ดัวยจำนวน 512 node เหมือนเดิม ครับ ชั้นสุดท้ายจะมี node จำนวน 10 node เพื่อทาย 10 class ของเราครับ ลักษณะจะออกมาเป็น 0000010000 เป็น onehot เหมือนกัน เพราะเฉลยเราแปลงเป็น onehot แล้ว มี softmax เป็น activation function ในชั้นสุดท้าย

ตัวอย่าง Multilayer percepton

ตัวอย่างรูป Neural ของเรานะครับ มี จำนวน 4 ชั้นหลักๆ คือ input (748 node) hidden 2 ชั้น (ชั้นละ 512 node) และชั้นสุดท้ายเป็น output (10 node) เมื่อรันโค้ด โค้ดจะปริ้น summary ออกมาเป็น ข้อมูลจำนวนชั้นและ parameter ทั้งหมดครับ ดังรูป

จากรูปจะประกอบไปด้วย ชั้น hidden 512 เชื่อมกัน input ของเรา 784 ทำให้มี parameter ที่ต้องปรับทั้งหมดในชั้นนี้ (512 * (784+1)) = 401920 parameter ที่บวก 1 เพราะเพิ่ม bias เป็น input อีก 1 ตัวด้วยครับ เอาไว้ยก curve สำหรับชั้นถัดมา ก็ (512 * (512+1)) = 262656 และชั้นสุดท้าย เป็น (10 * (512+1)) = 5130 parameter ดังนั้นรวมทั้ง Model มี parameter ที่ต้องปรับ 669706 ตัว เยอะแฮะ ให้มานั่งปรับมือ คงไม่มีวันเสร็จแน่นอนครับ เราจะให้ neural มันปรับ backpropagation เอาครับ เรื่อง backpropagation เอาไว้งวดหน้านะครับ

จากนั้น เราจะเริ่ม train เลยครับใช้คำสั่ง

model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
model.fit(x_train,y_train,batch_size=100,epochs=1000,validation_data=(x_test,y_test))

score = model.evaluate(x_test, y_test, verbose=0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])

model.compile เราใช้เพื่อบอกว่าเราจะเอาวิธีการตรวจสอบและ ตัว optimizer วิธีการใดครับ รายละเอียดอ่านได้ที่ keras document คล่าวๆ คือ ใช้ optimizer เป็น adam มี loss function เป็น categorical_crossentropy และวัดความแม่นยำด้วยการหา accuracy

จากนั้นก็ เรียกคำสั่ง fit ก็จะเริ่มทำการ train ครับ

ตัวอย่างการ Train ในแต่ละรอบครับ

สังเกตว่า ค่า val_acc จะค่อยๆ เพิ่มขึ้นมาครับ จาก 0.92 ไปเรื่อยๆ สูงสุดจะอยู่ที่ประมาณ 0.98 กว่าๆ ครับ รอจนการทำงานสิ้นสุดเราก็จะได้ model เพื่อใช้สำหรับทายตัวเลขด้วยมือเขียนของเราครับ

Final Test accuracy

Full source code

from __future__ import print_function
from keras.datasets import mnist
import matplotlib.pyplot as plt
import keras
# input image dimensions

def plot_image(xTest,YRealValue,YPredic):
plt.figure(3)
fig, axes = plt.subplots(10, 10, figsize=(28, 28))
test_images = xTest.reshape(-1, 28, 28)

for i, ax in enumerate(axes.flat):
ax.imshow(test_images[i*10+i],cmap=plt.get_cmap('gray'))
# ax.text(0.05, 0.05, str(YPredic[i*10+i]),
# transform=ax.transAxes,
# color='green' if (YRealValue[i*10+i][0] == YPredic[i*10+i]) else 'red')


img_rows, img_cols = 28, 28

(x_train, y_train), (x_test, y_test) = mnist.load_data()
print(x_train.shape)
plt.subplot(221)
plt.imshow(x_train[0], cmap=plt.get_cmap('gray'))
plt.subplot(222)
plt.imshow(x_train[1], cmap=plt.get_cmap('gray'))
plt.subplot(223)
plt.imshow(x_train[2], cmap=plt.get_cmap('gray'))
plt.subplot(224)
plt.imshow(x_train[3], cmap=plt.get_cmap('gray'))
# show the plot
plt.show()


x_train = x_train.reshape(60000, 784)
x_test = x_test.reshape(10000, 784)
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255
print(x_train.shape[0], 'train samples')
print(x_test.shape[0], 'test samples')

print("Y train sample = ",y_train[0])
# convert class vectors to binary class matrices
y_train = keras.utils.to_categorical(y_train, 10)
y_test = keras.utils.to_categorical(y_test, 10)
print("Y train sample with one-hot = ",y_train[0])


from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Dropout

model = Sequential()
model.add(Dense(512, activation='sigmoid', input_shape=(784,)))
model.add(Dropout(0.2))
model.add(Dense(512, activation='sigmoid'))
model.add(Dropout(0.2))
model.add(Dense(10, activation='softmax'))

model.summary()
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
model.fit(x_train,y_train,batch_size=100,epochs=1000,validation_data=(x_test,y_test))

score = model.evaluate(x_test, y_test, verbose=0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])

สำหรับบทความนี้ จบไว้เพียงเท่านี้ครับผม