วันอาทิตย์ที่ 16 กันยายน พ.ศ. 2561

การสร้าง โครงข่ายประสาทเทียม CNN ด้วย Keras



Deep Learning คือการกลับมาครั้งใหม่ของ Neural Network โดยคราวนี้เน้นที่โครงสร้างที่ลึกกว่าก่อนมาก และที่เป็นไปได้ตอนนี้เพราะ

1.เรามีข้อมูลเยอะพอ พวก big data ที่คนพูดๆ กัน
2.เรามีอุปกรณ์คำนวณที่เหมาะสมนั่นคือ GPU card สำหรับคำนวณ และ
3.เรามีเทคนิคในการ train network ที่มีโครงสร้างที่ลึกได้

นักวิจัยด้านการเรียนรู้ของ Machine ได้เสนอสถาปัตยกรรมการเรียนรู้หลายแบบบนหลักการของการเรียนรู้เชิงลึกนี้ ได้แก่ โครงข่ายประสาทเทียมแบบสังวัตนาการ (Convolutional Neural Networks)

Convolutional Neural Networks (CNN) หรือโครงข่ายประสาทเทียม เป็นแบบจำลองการทำงานของโครงข่ายประสาทจริง ในโครงข่ายประสาทจริงนั้นเซลล์ประสาทต่างก็เชื่อมต่อกัน แต่ละเซลล์รับกระแสประสาทจากเซลล์ข้างเคียงผ่านแขนงประสาท เมื่อแอมพลิจูดของสัญญาณที่รับมาสูงพอจะเกิดการชักนำให้เซลล์นี้สร้างกระแสประสาทใหม่และส่งออกไปให้เพื่อนบ้าน แนวความคิดนี้นำไปสู่แบบจำลองเซลล์ประสาทเทียม เซลล์เดียว


MNIST Data คือ ชุดข้อมูลถูกสร้างขึ้นจากชุดเอกสารที่สแกนแล้วจากสถาบันมาตรฐานและเทคโนโลยีแห่งชาติ (NIST) นี่คือที่มาของชุดข้อมูลมาจากชุดข้อมูล NIST หรือ MNIST ที่แก้ไขแล้ว

ภาพของตัวเลขถูกนำมาจากเอกสารที่สแกนหลายฉบับโดยมีขนาดและศูนย์กลางเป็นเท่าๆกัน ซึ่งทำให้เป็นชุดข้อมูลที่ยอดเยี่ยมสำหรับการประเมินโมเดล ซึ่งช่วยให้นักพัฒนาซอฟต์แวร์สามารถมุ่งเน้นไปที่การเรียนรู้เกี่ยวกับการจัดเตรียมที่น้อยมาก

แต่ละภาพมีขนาด 28 x 28 พิกเซล (784 พิกเซล) เป็นมาตรฐานของชุดข้อมูล เพื่อใช้ประเมินและเปรียบเทียบโมเดล โดยใช้ภาพ 60,000 ภาพในการฝึกแบบจำลองและใช้ชุดทดสอบ 10,000 ภาพ

มี 10 หลัก (0 ถึง 9) ที่จะทำนาย ผลลัพธ์ถูกรายงานโดยใช้ข้อผิดพลาดในการทำนายซึ่งไม่มีอะไรมากไปกว่าความถูกต้องในการแยกแยะตัวเลข


ขั้นตอนการทำงาน


ก่อนการทำงานให้ติดตั้ง  TensorFlow และ Keras ตามลิงค์ด้านล่าง

การติดตั้ง TensorFlow และ Keras


เปิดโปรแกรม เทอมินอล (Root Terminal)

สร้างโฟลเดอร์ basic_mnist โดยใช้คำสั่ง


mkdir basic_cnn


เปิดโปรแกรม Python 3 (IDLE)


Simple Convolutional Neural Network for MNIST

เครือข่ายประสาทเทียมแบบเรียบง่ายสำหรับ MNIST ตอนนี้เราจะได้เห็นวิธีการโหลดชุดข้อมูล MNIST และฝึกรูปแบบ perceptron หลายชั้นที่เรียบง่าย ในการพัฒนาเครือข่ายประสาทเทียมที่ซับซ้อนมากขึ้นหรือ Convolutional Neural Networks (CNN)



ซึ่ง Keras มีความสามารถมากในการสร้างเครือข่ายประสาทเทียม

ในส่วนนี้เราจะสร้าง CNN ที่เรียบง่ายสำหรับ MNIST และแสดงให้เห็นถึงวิธีการใช้ทุกแง่มุมของการใช้งาน CNN อันทันสมัย ซึ่งได้แก่ Convolutional layers, Pooling layers และ Dropout layers.

เขียนโค้ดดังนี้

ขั้นตอนแรกคือการนำเข้า classes และฟังก์ชันที่จำเป็น

import numpy
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Dropout
from keras.layers import Flatten
from keras.layers.convolutional import Conv2D
from keras.layers.convolutional import MaxPooling2D
from keras.utils import np_utils
from keras import backend as K
K.set_image_dim_ordering('th')

เราจะเริ่มต้นเครื่องเลือกตัวเลขแบบสุ่ม ให้ไปเป็นค่าคงที่ seed สำหรับการทำซ้ำของผลลัพธ์

# fix random seed for reproducibility
seed = 7
numpy.random.seed(seed)

ต่อไปเราต้องโหลดชุดข้อมูล MNIST ใหม่เพื่อให้เหมาะสมกับการฝึกอบรม CNN ใน Keras เลเยอร์ที่ใช้สำหรับการคำนวณสองมิติคาดว่าค่าพิกเซลจะมีขนาด [pixels] [width] [height]

ในกรณีของ RGB พิกเซลขนาดแรกจะเป็น 3 สำหรับองค์ประกอบ สีแดง เขียวและน้ำเงิน และจะเหมือนกับการใส่ข้อมูลภาพ 3 ภาพสำหรับภาพสีทุกภาพ ในกรณีของ MNIST ที่ค่าพิกเซลเป็นสีเทาขนาดพิกเซลจะถูกกำหนดเป็น 1

# load data
(X_train, y_train), (X_test, y_test) = mnist.load_data()
# reshape to be [samples][pixels][width][height]
X_train = X_train.reshape(X_train.shape[0], 1, 28, 28).astype('float32')
X_test = X_test.reshape(X_test.shape[0], 1, 28, 28).astype('float32')


เช่นเคยเป็นความคิดที่ดีที่จะปรับค่าพิกเซลให้อยู่ในช่วง 0 และ 1 และหนึ่งจะเข้ารหัสตัวแปรเอาต์พุตได้

# normalize inputs from 0-255 to 0-1
X_train = X_train / 255
X_test = X_test / 255
# one hot encode outputs
y_train = np_utils.to_categorical(y_train)
y_test = np_utils.to_categorical(y_test)
num_classes = y_test.shape[1]


ต่อไปเราจะกำหนดรูปแบบเครือข่ายประสาทของเรา

เครือข่ายประสาทคอมเพล็กซ์มีความซับซ้อนมากกว่า perceptron หลายชั้นมาตรฐานดังนั้นเราจะเริ่มต้นด้วยการใช้โครงสร้างที่เรียบง่ายเพื่อเริ่มต้นด้วยองค์ประกอบที่ใช้องค์ประกอบทั้งหมดเพื่อให้ได้ผลลัพธ์ที่ทันสมัย ด้านล่างสรุปโครงสร้างเครือข่าย

1.ชั้นที่ซ่อนแรกคือชั้นแบบ Convolutional เรียกว่า Convolution2D เลเยอร์มีแผนที่คุณลักษณะ 32 ซึ่งมีขนาด 5 × 5 และฟังก์ชันการเปิดใช้งานเครื่องแก้ไขภาพ นี่คือเลเยอร์อินพุตที่คาดหวังให้รูปภาพที่มีเค้าร่างโครงร่างเหนือ [พิกเซล] [width] [height]

2. ถัดไปเรากำหนดเลเยอร์การรวมที่ใช้เวลาสูงสุดที่เรียกว่า MaxPooling2D มีการกำหนดค่าด้วยขนาดพูล 2 × 2

3. ชั้นถัดไปคือชั้นการจัดระเบียบโดยใช้ dropout เรียกว่า Dropout มีการกำหนดค่าให้สุ่มเลือก 20% ของเซลล์ประสาทในเลเยอร์เพื่อลดการขูดรีด

4. ถัดไปคือเลเยอร์ที่แปลงข้อมูลเมทริกซ์ 2D เป็นเวกเตอร์ที่เรียกว่า Flatten ช่วยให้เอาท์พุทประมวลผลโดยใช้ชั้นมาตรฐานที่เชื่อมต่อกันอย่างเต็มที่

5. ถัดไปชั้นเชื่อมต่ออย่างเต็มที่กับ 128 เซลล์และการเปิดใช้งานฟังก์ชัน rectifier

6.สุดท้ายเลเยอร์เอาท์พุทมี 10 เซลล์สำหรับ 10 คลาสและฟังก์ชันการเปิดใช้งาน softmax เพื่อสร้างการคาดการณ์ที่น่าจะเป็นไปได้สำหรับแต่ละคลาส

ก่อนหน้านี้แบบจำลองได้รับการฝึกอบรมโดยใช้การสูญเสียลอการิทึมและอัลกอริธึมการไล่ระดับสี ADAM

def baseline_model():
# create model
model = Sequential()
model.add(Conv2D(32, (5, 5), input_shape=(1, 28, 28), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.2))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dense(num_classes, activation='softmax'))
# Compile model
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
return model

เราประเมินแบบจำลองเช่นเดียวกับก่อนหน้าด้วย perceptron หลายชั้น เป็น CNN ที่มี แบบจำลองมีขนาดพอดีกับ epochs 10 รอบ ที่มีการอัปเดต batch ทุกๆ 200 ภาพ

# build the model
model = baseline_model()
# Fit the model
model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=10, batch_size=200)
# Final evaluation of the model
scores = model.evaluate(X_test, y_test, verbose=0)
print("CNN Error: %.2f%%" % (100-scores[1]*100))



โดยมีโค้ดทั้งหมดดังนี้



import numpy
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Dropout
from keras.layers import Flatten
from keras.layers.convolutional import Conv2D
from keras.layers.convolutional import MaxPooling2D
from keras.utils import np_utils
from keras import backend as K
K.set_image_dim_ordering('th')

# fix random seed for reproducibility
seed = 7
numpy.random.seed(seed)

# load data
(X_train, y_train), (X_test, y_test) = mnist.load_data()
# reshape to be [samples][pixels][width][height]
X_train = X_train.reshape(X_train.shape[0], 1, 28, 28).astype('float32')
X_test = X_test.reshape(X_test.shape[0], 1, 28, 28).astype('float32')


# normalize inputs from 0-255 to 0-1
X_train = X_train / 255
X_test = X_test / 255
# one hot encode outputs
y_train = np_utils.to_categorical(y_train)
y_test = np_utils.to_categorical(y_test)
num_classes = y_test.shape[1]

def baseline_model():
# create model
model = Sequential()
model.add(Conv2D(32, (5, 5), input_shape=(1, 28, 28), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.2))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dense(num_classes, activation='softmax'))
# Compile model
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
return model

# build the model
model = baseline_model()
# Fit the model
model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=10, batch_size=200)
# Final evaluation of the model
scores = model.evaluate(X_test, y_test, verbose=0)
print("CNN Error: %.2f%%" % (100-scores[1]*100))


หรือดาวน์โหลดโค้ดจากลิงค์ด้านล่าง




Save ไปที่ โฟลเดอร์ basic_cnn และตั้งชื่อเป็น simple_cnn.py



ทดสอบการทำงาน Run Module


ตัวอย่างเช่นความแม่นยำในการฝึกอบรมและการทดสอบการตรวจสอบจะถูกพิมพ์ในแต่ละรอบและเมื่อสิ้นสุด อัตราการผิดพลาดในการตรวจสอบ และจะใช้เวลานานประมาณ 3-4 ชั่วโมง

ถึงจะเห็นได้ว่าเครือข่ายประสบความสำเร็จในอัตราข้อผิดพลาด 1.01% หรือมีความแม่นยำ 98.99% ซึ่งดีกว่าแบบ TensorFlow กับรูปภาพตัวเลข MNIST Data เบื้องต้น ซึ่งมีความแม่นยำเพียง 91.62%


ถ้าใช้โปรแกรม FileZilla (ไฟล์ซิลลา) sftp เข้าไป ที่โฟลเดอร์ .keras/datasets จะพบ ไฟล์ mnist.npz ซึ่งเป็นไฟล์ฐานขอมูลของ MNIST Data ที่เราดาวน์โหลดมา และเรียกใช้ในการทำงานนั่นเอง


# ในกรณีดาวน์โหลดฐานข้อมูลยังไม่เสร็จแล้วปิดโปรแกรมลงไปก่อน จะมีปัญหาในการดาวน์โหลดฐานข้อมูลไม่ได้ในครั้งต่อไป ให้มาลบไฟล์ที่อยู่ในส่วนนี้เสียก่อน #



หมายเหตุ : เรียบเรียงและแก้ไขดัดแปลงจากบทความด้านล่าง

Handwritten Digit Recognition using Convolutional Neural Networks in Python with Keras

ไม่มีความคิดเห็น:

แสดงความคิดเห็น