Easy Neural Networks with mnist (part1 เตรียมข้อมูล)

Pisit Bee
Boobee
Published in
3 min readNov 23, 2017

เรามาเริ่ม เล่นกับ Neural Networks กับ Dataset ชื่อว่า mnits กันดีกว่าครับ

Mnist dataset

ผมจะขอเล่าว่า เจ้า mnits เนี่ยเป็น Dataset ที่เป็นรูปภาพตัวเลขครับ ได้มาจากตัวเลขของไปรษณีเวลาที่เราจะเขียนส่งก็ต้องใส่รหัสไปรษณีย์ ทีนี้อยากจะต้องการให้เครื่องมันสามารถคัดแยกว่าตัวเลขที่คนเขียนมาเป็นตัวเลขอะไรตั้งแต่ 0–9 ลำพังลายมือคนเขียนก็อ่านกันไม่ค่อยออก เครื่องจะอ่านได้ไหม ลองมาดูครับ

Mnits สามารถ Downloads ได้จาก website นี้ครับ http://yann.lecun.com/exdb/mnist เจ้าพ่อขาใหญ่แห่งวงการ Neural Network ของเรานั่นเอง ซึ่ง dataset จะประกอบไปด้วย training set จำนวน 60,000 examples, และ test set จำนวน 10,000 examples ครับ แต่ละรูปมีขนาด 28×28 pixels เราจะนำรูปเหล่านี้มาลอง Train ด้วย Neural network MLP ธรรมดาก่อนนะครับ

MLP มาจาก Multilayer Perceptron เป็น NeuralNetwork แบบหลายชั้น เบื้องต้น

เริ่มจากเขียนโค้ดโหลด Dataset ของ Mnist ลงมาที่เครื่อง ซึ่ง Keras มี Function ไว้รองรับครับ ผมทำการ import cv2 สำหรับใช้ library opencv ไว้รอเพื่อสำหรับแสดงผลภาพ เรียกคำสั่ง mnist.load_data() เพื่อโหลดข้อมูลจาก internet มาครับ หากเครื่องไหนเคยโหลดแล้ว จะเรียกใช้ไฟล์ ในเครื่องแทน

from __future__ import print_function
from keras.datasets import mnist
import matplotlib.pyplot as plt
import keras
# input image dimensions
img_rows, img_cols = 28, 28

(x_train, y_train), (x_test, y_test) = mnist.load_data()

ข้อมูลถูกแบ่งออกเป็นส่วนของ train และ test มี x_train สำหรับ training inputและ y_train สำหรับเฉลย ส่วนของ test ก็คล้ายๆ กันครับ ทีนี้ลองมาดูว่า x_train ให้อะไรเรามาบ้างเพิ่มโค้ดด้านล่างลงไปครับ โค้ดด้านล่างจะสั่งให้ แสดง มิติของข้อมูล x_train ออกมาและเอา x_train ตัวแรก( index ที่ 0 มาแสดงผล)

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 เป็น array 3 มิติ ชุดแรกเป็นจำนวนข้อมูล มีขนาด 60000 ตัวซึ่งหมายถึงภาพ 60000 ภาพ แต่ละภาพขนาด 28 * 28 pixels นั่นเอง พอรันมาถึงคำสั่ง imshow จะเอาภาพแรกมาแสดงครับ จะได้รูปคล้ายๆ เลข 5 ??

หลังจากนั้น ผมทำการ จะนำ ภาพเข้าไปยัง Neural network แล้วนะครับ แต่ช้าก่อนลองมาดู โครงสร้างของ MLP เราก่อนครับ MLP ของเรามันเป็น input แถวๆ เดียวนี่นา แต่ รูปของเรามัน เป็น 2 มิติ ขนาด 28*28 =784 ทำไงได้ครับ จัดการแปลงให้มันอยู่ในรูปแถวเดียวกันเลยครับ หลักการก็คือ เอา แต่ละ row ของ Array มาต่อกันไปเรื่อยๆ row แรก มี 28 ตัว ก็เอา row ที่ 2 มาต่อท้าย row แรกทำไปเรื่อยๆ ก็จะได้สายของข้อมูลยาวๆ เลยครับ โดย python ทำได้ง่ายมากใช้คำสั่ง reshape ครับ ลองไปดูกัน

An Example of Multilayer Perceptron Architecture (figure courtesy of https://github.com/ledell/sldm4-h2o/blob/master/sldm4-deeplearning-h2o.Rmd)
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')

จากโค้ดด้านบนนะครับ ทำการ reshape x_train และ x_test ไปด้วยเลยครับ โดยปรับให้เป็น 2 มิติคงขนาดตัวอย่างข้อมูล เป็น 60000 เหมือนเดิม แต่ด้านหลังปรับให้เป็น สายเดียวยาวๆ ขนาด 784 ครับ หน้าตาก็ลองนึกงภาพนักเรียน 1 ห้องมีจำนวนนักเรียน 784 คนละกันครับ แต่เรามีทั้งหมด 60000 ห้อง

ส่วนเหตุที่หารด้วย 255 เพราะว่า ข้อมูลของเราอยู่ในช่วง 0->255 ครับ ภาพ Gray scale ดังนั้นเราจะปรับให้มันอยู่ในช่วง 0–>1 ครับ ถ้า 255 / 255 = 1 , 120/255 = 0.470588

ต่อมามาเริ่มจัดการส่วนของ y ที่เป็นเฉลยบ้างครับ ลอง print y_train ออกมาดูจะได้เลข 5 ครับซึ่งตรงกับ รูปของเราที่แสดงในตอนแรก (เดาถูกด้วย)

print("Y train sample = ",y_train[0])

แต่เนื่องจาก MLP นิยมให้เลข output อยู่ในช่วง 0–1 ครับ ดังนั้นเราจะทำการ ปรับวิธีการให้ output ใหม่ โดยหลักที่นิยมคือจะทำข้อมูลให้เป็น one-hot encoding ซึ่งวิธีการแปลง ง่ายมากครับ ตอนนี้เรามี Class ที่เป็นไปได้ 10 Classes คือ 0–9 เราสามารถแปลงเลข 5 ให้เป็น one-hot ได้โดยใช้ โค้ด 0000100000 แทนเลข 5 ถ้าเลข
เลข 0 เป็น 0000000001
เลข 1 เป็น 0000000010
เลข 2 เป็น 0000000100
เลข 3 เป็น 0000001000
เลข 4 เป็น 0000010000
เลข 5 เป็น 0000100000
ต่อไปคงเดาได้นะครับ จนถึงเลข 9 โดย Keras ก็จัดไว้ให้เพราะเราคงใช้งานมันบ่อยแน่ๆ เรียกคำสั่งดังนี้ครับ

# 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])

สิ้นสุดการเตรียมข้อมูลแล้วครับ เดี๋ยวมาต่อ part 2 เริ่มสร้างและ train ข้อมูล

--

--