การทำ Regularization แบบสมัยใหม่ ด้วยเทคนิค Augmentation, Batch Normalization และ Dropout

Momay Marisa
10 min readOct 6, 2020

--

ภาพน้องเหมียวจาก : https://www.pinterest.com/pin/97038566947701380/?nic_v2=1arOsNriO

การเพิ่มประสิทธิภาพของ Model มีวิธีการหลัก2 อย่างที่ต้องให้ความสำคัญ คือ

  1. การลด Generalization Error ด้วย Regularization คือ การปรับแต่งให้ Model มีประสิทธิภาพในการทำนายที่ดี ลด Error จากข้อมูลที่มันไม่เคยเห็นมาก่อน ด้วยการเรียนรู้จาก Training Dataset ใช้เพื่อแก้ปัญหา Underfitting หรือ Overfitting ของ Machine Learning Model
  2. การลด Cost Value ด้วย Optimization หรือการหาค่าที่เหมาะสมที่สุด

ในบทความนี้จะพูดถึงวิธีการแก้ปัญหา Overfitting ของ Neural Network แบบ Classification Model ที่มีการ Train ด้วย Fashion-MNIST Dataset โดยใช้ 3 เทคนิคด้วยกัน ได้แก่

  • การทำ Augmentation
  • Batch Normalization
  • Dropout

* Fashion-MNIST Dataset *

Fashion-MNIST เป็น Dataset ที่เป็นภาพเสื้อผ้า กระเป๋า และรองเท้า ขนาด 28x28 Pixel แบบ Grayscale แบ่งข้อมูลเป็น Train 60,000 ภาพ และข้อมูล Test อีก 10,000 ภาพ รวมทั้งหมด 10 ประเภท โดยมีการกำหนด Label ตั้งแต่ 0–9 ได้แก่ T-shirt/top, Trouser,Pullover,Dress, Coat,Sandal,Shirt,Sneaker, Bag และ Ankle boot เราจะทำการ Load Dataset แล้วขยายมิติของ Dataset ทำ Scaling ข้อมูล ระหว่าง 0–1 เข้ารหัสผลเฉลยแบบ One-hot Encoding และ Split Dataset สำหรับการ Train และ Validation ตามขั้นตอนต่อไปนี้เลยย

  • ใช้ GPU ในการอ่าน ด้วยคำสั่งนี้
!nvidia-smi -Limport tensorflow as tf
tf.__version__
config = tf.compat.v1.ConfigProto()
config.gpu_options.allow_growth = True
sess = tf.compat.v1.Session(config=config)

print( 'Tensorflow Version:', tf.__version__)
print("GPU Available::", tf.config.list_physical_devices('GPU'))
  • Import Library ที่จำเป็นน
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Activation, Conv2D, MaxPool2D, Flatten, Dropout, BatchNormalization
from tensorflow.keras.optimizers import RMSprop,Adam
from tensorflow.keras.utils import to_categorical
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from sklearn.model_selection import train_test_split
from matplotlib import pyplot
from tensorflow.keras.datasets import fashion_mnist
import plotly.graph_objs as goimport cv2

*** สำหรับใครที่ error ที่ cv2 ให้ทำการ pip install opencv-python ก่อน ****

  • กำหนดค่า Parameter
IMG_ROWS = 28
IMG_COLS = 28
NUM_CLASSES = 10
TEST_SIZE = 0.2
RANDOM_STATE = 99
NO_EPOCHS = 10
BATCH_SIZE = 128
  • Load Dataset
(train_data, y), (test_data, y_test) = fashion_mnist.load_data()print("Fashion MNIST train -  rows:",train_data.shape[0]," columns:", train_data.shape[1], " rows:", train_data.shape[2])
print("Fashion MNIST test - rows:",test_data.shape[0]," columns:", test_data.shape[1], " rows:", train_data.shape[2])
for i in range(9):
pyplot.subplot(330 + 1 + i)
pyplot.imshow(train_data[i], cmap=pyplot.get_cmap('gray'))
pyplot.show()
  • ทำการขยายมิติของ Dataset
print(train_data.shape, test_data.shape)train_data = train_data.reshape((train_data.shape[0], 28, 28, 1))
test_data = test_data.reshape((test_data.shape[0], 28, 28, 1))
print(train_data.shape, test_data.shape)
  • ทำ Scaling
train_data = train_data / 255.0
test_data = test_data / 255.0
  • เข้ารหัสผลเฉลยแบบ One-hot Encoding
print(y.shape, y_test.shape)
print(y[:10])
y = to_categorical(y)
y_test = to_categorical(y_test)
print(y.shape, y_test.shape)
y[:10]
  • แบ่งข้อมูลสำหรับ Train 80 และ Validate 20 โดยการสุ่ม
X_train, X_val, y_train, y_val = train_test_split(train_data, y, test_size=TEST_SIZE, random_state=RANDOM_STATE)X_train.shape, X_val.shape, y_train.shape, y_val.shape

* Baseline Model *

เป็นการนิยาม Model, Compile Model และ Train Model โดยยังไม่ใช้เทคนิค Regularization มีขั้นตอนดังนี้

  • นิยาม Model
model = Sequential()#1. CNN LAYER
model.add(Conv2D(filters = 32, kernel_size = (3,3), padding = 'Same', input_shape=(28, 28, 1)))
model.add(Activation("relu"))
#2. CNN LAYER
model.add(Conv2D(filters = 32, kernel_size = (3,3), padding = 'Same'))
model.add(Activation("relu"))
model.add(MaxPool2D(pool_size=(2, 2)))#3. CNN LAYER
model.add(Conv2D(filters = 64, kernel_size = (3,3), padding = 'Same'))
model.add(Activation("relu"))
#4. CNN LAYER
model.add(Conv2D(filters = 64, kernel_size = (3,3), padding = 'Same'))
model.add(Activation("relu"))
model.add(MaxPool2D(pool_size=(2, 2)))#FULLY CONNECTED LAYER
model.add(Flatten())
model.add(Dense(256))
model.add(Activation("relu"))
#OUTPUT LAYER
model.add(Dense(10, activation='softmax'))
  • Compile Model
optimizer = Adam()
model.compile(optimizer = optimizer, loss = "categorical_crossentropy", metrics=["accuracy"])
model.summary()
  • Train Model
train_model = model.fit(X_train, y_train,
batch_size=BATCH_SIZE,
epochs=NO_EPOCHS,
verbose=1,
validation_data=(X_val, y_val))
  • Evaluation

→ Import Library มาก่อนน

from plotly import toolsimport plotly

→ Function

def create_trace(x,y,ylabel,color):
trace = go.Scatter(
x = x,y = y,
name=ylabel,
marker=dict(color=color),
mode = "markers+lines",
text=x
)
return trace

def plot_accuracy_and_loss(train_model):
hist = train_model.history
acc = hist['accuracy']
val_acc = hist['val_accuracy']
loss = hist['loss']
val_loss = hist['val_loss']
epochs = list(range(1,len(acc)+1))

trace_ta = create_trace(epochs,acc,"Training accuracy", "Green")
trace_va = create_trace(epochs,val_acc,"Validation accuracy", "Red")
trace_tl = create_trace(epochs,loss,"Training loss", "Blue")
trace_vl = create_trace(epochs,val_loss,"Validation loss", "Magenta")

fig = tools.make_subplots(rows=1,cols=2, subplot_titles=('Training and validation accuracy',
'Training and validation loss'))
fig.append_trace(trace_ta,1,1)
fig.append_trace(trace_va,1,1)
fig.append_trace(trace_tl,1,2)
fig.append_trace(trace_vl,1,2)
fig['layout']['xaxis'].update(title = 'Epoch')
fig['layout']['xaxis2'].update(title = 'Epoch')
fig['layout']['yaxis'].update(title = 'Accuracy', range=[0,1])
fig['layout']['yaxis2'].update(title = 'Loss', range=[0,1])
plotly.offline.iplot(fig, filename='accuracy-loss')

→ Plot accuracy

plot_accuracy_and_loss(train_model)

→ ดูค่า accuracy

score = model.evaluate(test_data, y_test,verbose=0)
print("Test Loss:",score[0])
print("Test Accuracy:",score[1])

จากกราฟ Loss ด้านบน พบว่า Model มีปัญหา Overfitting ตั้งแต่รอบที่ 10 โดยเมื่อวัดประสิทธิภาพการ Predict ด้วย Test Dataset ได้ค่า Accuracy 92.44%

* Image Augmentation *

ปัญหา Overfitting ของ Model สามารถแก้ได้ด้วยการเพิ่มจำนวน Data ในการ Train แต่ด้วย Dataset ของมีจำกัด ในบางกรณีเราจึงต้องสังเคราะห์ Data ขึ้นมาเอง ในกรณีของ Data แบบ Image เราสามารถใช้เทคนิคอย่างเช่นการหมุนภาพ การเลื่อนภาพ และการกลับภาพ ฯลฯ ซึ่งนอกจากเป็นการขยายจำนวน Data แล้ว Image Augmentation ยังช่วยเพิ่มความหลากหลายของภาพที่จะนำไป Train อีกด้วย โดยในบทความนี้จะขอยกตัวอย่างการทำ Image Augmentation 8 วิธีด้วยกัน ได้แก่

  1. Vertical Shift
  2. Horizontal Shift
  3. Shear
  4. Zoom
  5. Vertical Flip
  6. Horizontal Flip
  7. Rotate
  8. Fill Mode
    8.1 Constant Values
    8.2 Nearest Neighbor
    8.3 Reflect Values
  • ขั้นตอนแรกโหลดรูป“น้องเหมียวกันก่อนเลยย จะได้รูปน้องเหมียวหน้าตาแบบนี้
  • Import Library ก่อนนะ!
import numpy as np
import matplotlib.pyplot as plt
  • อ่านไฟล์ภาพน้องเหมียวว ด้วย CV2
cat = cv2.imread('cat.jpg')
cat.shape
  • แปลงระบบสีจาก BGR ซึ่งเป็นค่า Default ของ OpenCV Library เป็น RGB
cat = cv2.cvtColor(cat, cv2.COLOR_RGB2BGR)
  • Plot ภาพน้องกันน
plt.figure(dpi=100)
plt.imshow(cat)
  • ขยายมิติของภาพจาก 3 มิติเป็น 4 มิติ เพื่อเตรียมนำเข้า Function ทำ Image Augmentation
print(cat.shape)
cat = cat.reshape(1,cat.shape[0],cat.shape[1],cat.shape[2])
print(cat.shape)
  • ทดลองทำ “Vertical Shift” ด้วยการเลื่อนภาพขึ้นลงแบบสุ่มไม่เกิน 20%
datagen = ImageDataGenerator(height_shift_range=0.2)aug_iter = datagen.flow(cat, batch_size=1)fig, ax = plt.subplots(nrows=1, ncols=3, figsize=(15,15))for i in range(3):
image = next(aug_iter)[0].astype('uint8')
ax[i].imshow(image)
ax[i].axis('off')
  • ทดลองทำ “Horizontal Shift” ด้วยการเลื่อนภาพซ้ายขวาแบบสุ่มไม่เกิน 20%
datagen = ImageDataGenerator(width_shift_range=0.2)aug_iter = datagen.flow(cat, batch_size=1)fig, ax = plt.subplots(nrows=1, ncols=3, figsize=(15,15))for i in range(3):
image = next(aug_iter)[0].astype('uint8')
ax[i].imshow(image)
ax[i].axis('off')
  • ทดลองบิดภาพ (Shear) แบบสุ่มไม่เกิน 50 องศา
datagen = ImageDataGenerator(shear_range=50)aug_iter = datagen.flow(cat, batch_size=1)fig, ax = plt.subplots(nrows=1, ncols=3, figsize=(15,15))for i in range(3):
image = next(aug_iter)[0].astype('uint8')
ax[i].imshow(image)
ax[i].axis('off')
  • ทดลองขยายภาพ (Zoom) แบบสุ่มไม่เกิน 40%
datagen = ImageDataGenerator(zoom_range=0.4)aug_iter = datagen.flow(cat, batch_size=1)fig, ax = plt.subplots(nrows=1, ncols=3, figsize=(15,15))for i in range(3):
image = next(aug_iter)[0].astype('uint8')
ax[i].imshow(image)
ax[i].axis('off')
  • ทดลองพลิกภาพแนวตั้ง (Vertical Flip) แบบสุ่ม
datagen = ImageDataGenerator(vertical_flip=True)aug_iter = datagen.flow(cat, batch_size=1)fig, ax = plt.subplots(nrows=1, ncols=3, figsize=(15,15))for i in range(3):
image = next(aug_iter)[0].astype('uint8')
ax[i].imshow(image)
ax[i].axis('off')

fig.savefig('cat.jpeg', dpi=300)
  • ทดลองพลิกภาพแนวนอน (Horizontal Flip) แบบสุ่ม
datagen = ImageDataGenerator(horizontal_flip=True)aug_iter = datagen.flow(cat, batch_size=1)fig, ax = plt.subplots(nrows=1, ncols=3, figsize=(15,15))for i in range(3):
image = next(aug_iter)[0].astype('uint8')
ax[i].imshow(image)
ax[i].axis('off')
  • ทดลองหมุนภาพ (Rotate) ไม่เกิน 40 องศา แบบสุ่ม
datagen = ImageDataGenerator(rotation_range=40)aug_iter = datagen.flow(cat, batch_size=1)fig, ax = plt.subplots(nrows=1, ncols=3, figsize=(15,15))for i in range(3):
image = next(aug_iter)[0].astype('uint8')
ax[i].imshow(image)
ax[i].axis('off')
  • Fill Mode เมื่อมีการเลื่อนภาพ บิดภาพ หมุนภาพ จะเกิดพื้นที่ว่างที่มุม ซึ่งจะมีการเติมภาพให้เต็มโดยใช้เทคนิคแบบ Nearest Neighbor ซึ่งเป็นการดึงสีบริเวณใกล้เคียงมาระบาย แต่เราก็ยังสามารถกำหนดวิธีการเติมสีลงในภาพ (Fill) ด้วยเทคนิคอื่นได้จาก Parameter fill_mode ดังนี้

→ เติมสีดำ (Constant Values)

datagen = ImageDataGenerator(rotation_range=30, fill_mode = 'constant')aug_iter = datagen.flow(cat, batch_size=1)fig, ax = plt.subplots(nrows=1, ncols=3, figsize=(15,15))for i in range(3):
image = next(aug_iter)[0].astype('uint8')
ax[i].imshow(image)
ax[i].axis('off')

→ เติมสีข้างเคียง (Nearest Neighbor)

datagen = ImageDataGenerator(rotation_range=30, fill_mode = 'nearest')aug_iter = datagen.flow(cat, batch_size=1)fig, ax = plt.subplots(nrows=1, ncols=3, figsize=(15,15))for i in range(3):
image = next(aug_iter)[0].astype('uint8')
ax[i].imshow(image)
ax[i].axis('off')

→ เติมสีแบบกระจกสะท้อน (Reflect Values)

datagen = ImageDataGenerator(rotation_range=50, fill_mode = 'reflect')aug_iter = datagen.flow(cat, batch_size=1)fig, ax = plt.subplots(nrows=1, ncols=3, figsize=(15,15))for i in range(3):
image = next(aug_iter)[0].astype('uint8')
ax[i].imshow(image)
ax[i].axis('off')

→ เติมสีจากภาพแบบต่อกัน (Wrap Values)

datagen = ImageDataGenerator(rotation_range=30, fill_mode = 'wrap')aug_iter = datagen.flow(cat, batch_size=1)fig, ax = plt.subplots(nrows=1, ncols=3, figsize=(15,15))for i in range(3):
image = next(aug_iter)[0].astype('uint8')
ax[i].imshow(image)
ax[i].axis('off')

เราจะเพิ่มความหลากหลายของภาพเพื่อแก้ปัญหา Overfitting ตามขั้นตอนต่อไปนี้

  • นิยามวิธีการทำ Image Augmentation
datagen = ImageDataGenerator(
rotation_range=0.05, #Randomly rotate images in the range
zoom_range = 0.2, # Randomly zoom image
width_shift_range=0.1, #Randomly shift images horizontally
height_shift_range=0.1, #Randomly shift images vertically
shear_range=0.05 #Randomly shear images
)
datagen.fit(X_train)
  • นิยาม Model
model = Sequential()#1. CNN LAYER
model.add(Conv2D(filters = 32, kernel_size = (3,3), padding = 'Same', input_shape=(28, 28, 1)))
model.add(Activation("relu"))
#2. CNN LAYER
model.add(Conv2D(filters = 32, kernel_size = (3,3), padding = 'Same'))
model.add(Activation("relu"))
model.add(MaxPool2D(pool_size=(2, 2)))#3. CNN LAYER
model.add(Conv2D(filters = 64, kernel_size = (3,3), padding = 'Same'))
model.add(Activation("relu"))
#4. CNN LAYER
model.add(Conv2D(filters = 64, kernel_size = (3,3), padding = 'Same'))
model.add(Activation("relu"))
model.add(MaxPool2D(pool_size=(2, 2)))#FULLY CONNECTED LAYER
model.add(Flatten())
model.add(Dense(256))
model.add(Activation("relu"))
#OUTPUT LAYER
model.add(Dense(10, activation='softmax'))
  • Compile Model
optimizer = Adam()
model.compile(optimizer = optimizer, loss = "categorical_crossentropy", metrics=["accuracy"])
model.summary()
  • Train Model
NO_EPOCHS = 60history = model.fit_generator(datagen.flow(X_train, y_train, batch_size=BATCH_SIZE),
shuffle=True,
epochs=NO_EPOCHS, validation_data = (X_val, y_val),
verbose = 1, steps_per_epoch=X_train.sha pe[0] // BATCH_SIZE)
  • Plot กราฟ
plot_accuracy_and_loss(history)
  • วัดค่า Accuracy จาก Test Dataset
score = model.evaluate(test_data, y_test,verbose=0)
print("Test Loss:",score[0])
print("Test Accuracy:",score[1])

จากกราฟ Loss ด้านบน เมื่อมีการ Train ทั้งหมด 60 Epoch พบว่า Validation Loss ไม่พุ่งขึ้นในรอบแรกๆ เหมือนในการ Train แบบไม่ใช้เทคนิค Image Augmentation โดยเมื่อวัดประสิทธิภาพการ Predict ด้วย Test Dataset ได้ค่า Accuracy 92.77% แต่ ในท้าย Epoch Validation Loss ก็ยังมีแนวโน้มที่จะเกิดปัญหา Overfitting อยู่ดี

* Batch Normalization *

เป็นเทคนิคในการทำ Scaling Data หรือเรียกอีกอย่างหนึ่งว่าการทำ Normalization เพื่อปรับค่าข้อมูลให้อยู่ในขอบเขตที่กำหนด ก่อนส่งออกจาก Node ใน Neural Network Layer เป็น Input ของ Layer ถัดไป

Batch Normalization จะใช้วิธีการแบบ Standardization ซึ่งจะมีการกำหนดค่า Mean และ Variance โดยการเรียนรู้จาก Batch ขนาดเล็ก ที่หยิบมาสอน Model ด้วย Layer พิเศษใน Neural Network เอง เราจะทดลองใช้ Batch Normalization กับเทคนิค Image Augmentation เพื่อแก้ปัญหา Overfitting ตามขั้นตอนต่อไปนี้

  • นิยามวิธีการทำ Image Augmentation
datagen = ImageDataGenerator(
rotation_range=0.05, # Randomly rotate images in the range
zoom_range = 0.2, # Randomly zoom image
width_shift_range=0.1, # Randomly shift images horizontally
height_shift_range=0.1, # Randomly shift images vertically
shear_range=0.05
)
datagen.fit(X_train)
  • นิยาม Model
model = Sequential()#1. CNN LAYER
model.add(Conv2D(filters = 32, kernel_size = (3,3), padding = 'Same', input_shape=(28, 28, 1)))
model.add(BatchNormalization())
model.add(Activation("relu"))
#2. CNN LAYER
model.add(Conv2D(filters = 32, kernel_size = (3,3), padding = 'Same'))
model.add(BatchNormalization())
model.add(Activation("relu"))
model.add(MaxPool2D(pool_size=(2, 2)))#3. CNN LAYER
model.add(Conv2D(filters = 64, kernel_size = (3,3), padding = 'Same'))
model.add(BatchNormalization())
model.add(Activation("relu"))
#4. CNN LAYER
model.add(Conv2D(filters = 64, kernel_size = (3,3), padding = 'Same'))
model.add(BatchNormalization())
model.add(Activation("relu"))
model.add(MaxPool2D(pool_size=(2, 2)))#FULLY CONNECTED LAYER
model.add(Flatten())
model.add(Dense(256))
model.add(BatchNormalization())
model.add(Activation("relu"))
#OUTPUT LAYER
model.add(Dense(10, activation='softmax'))

** Batch Normalization เหมาะสำหรับการวางไว้หลัง Activate Function ที่มีรูปร่างแบบ S-shapes หรือวางไว้หน้า Activate Function ที่ให้ผลลัพธ์แบบ Non-Gaussian Distributions ***

  • Compile Model
optimizer = Adam()
model.compile(optimizer = optimizer, loss = "categorical_crossentropy", metrics=["accuracy"])
model.summary()
  • Train Model
NO_EPOCHS = 50
history = model.fit_generator(datagen.flow(X_train, y_train, batch_size=BATCH_SIZE),
shuffle=True,
epochs=NO_EPOCHS, validation_data = (X_val, y_val),
verbose = 1, steps_per_epoch=X_train.shape[0] // BATCH_SIZE)
  • Plot กราฟ
plot_accuracy_and_loss(history)
  • วัดค่า Accuracy จาก Test Dataset
score = model.evaluate(test_data, y_test,verbose=0)
print("Test Loss:",score[0])
print("Test Accuracy:",score[1])

จากกราฟ Loss พบว่า Training Loss มีแนวโน้มที่จะลดลง แต่ Validation Loss ค่อนข้างแกว่ง เมื่อวัดประสิทธิภาพการ Predict ด้วย Test Dataset ได้ค่า Accuracy 92.33% จึงต้องใช้เทคนิคอื่นร่วมแก้ปัญหา Overfitting ซึ่งเทคนิคหนึ่งที่มักนำมาใช้งานร่วมกับ Batch Normalization คือ Dropout นั่นเองงง

* Dropout *

เป็นเทคนิคในการทำ Regularization ที่เรียบง่าย แต่มีประสิทธิภาพมาก โดยเมื่อมีการใช้งาน Dropout ภายใน Layer ที่กำหนดแล้ว Node ใน Layer นั้นจะถูกสุ่มเพื่อปิดการทำงานชั่วคราวในแต่ละรอบของการทำ Forward Propagation และ Back -propagation ตามอัตราที่กำหนด ในขณะที่มีการ Train Model ทำให้ไม่มีการ Update Weight ใดๆ ที่ถูกเชื่อมต่อกับ Neuron Node ที่กำลังถูกปิด ** ควรนำ Dropout มาใช้กับ Model ที่มี Capacity สูงมากพอ **

ทดลองใช้เทคนิค Dropout กันนน

  • นิยามวิธีการทำ Image Augmentation
datagen = ImageDataGenerator(
rotation_range=0.05, #Randomly rotate images in the range
zoom_range = 0.2, # Randomly zoom image
width_shift_range=0.1, #Randomly shift images horizontally
height_shift_range=0.1, #Randomly shift images vertically
shear_range=0.05 #Randomly shear images
)
datagen.fit(X_train)
  • นิยาม Model
model = Sequential()#1. CNN LAYER
model.add(Conv2D(filters = 32, kernel_size = (3,3), padding = 'Same', input_shape=(28, 28, 1)))
model.add(BatchNormalization())
model.add(Activation("relu"))
model.add(Dropout(0.3))
#2. CNN LAYER
model.add(Conv2D(filters = 32, kernel_size = (3,3), padding = 'Same'))
model.add(BatchNormalization())
model.add(Activation("relu"))
model.add(MaxPool2D(pool_size=(2, 2)))
model.add(Dropout(0.3))
#3. CNN LAYER
model.add(Conv2D(filters = 64, kernel_size = (3,3), padding = 'Same'))
model.add(BatchNormalization())
model.add(Activation("relu"))
model.add(Dropout(0.3))
#4. CNN LAYER
model.add(Conv2D(filters = 64, kernel_size = (3,3), padding = 'Same'))
model.add(BatchNormalization())
model.add(Activation("relu"))
model.add(MaxPool2D(pool_size=(2, 2)))
model.add(Dropout(0.3))
#FULLY CONNECTED LAYER
model.add(Flatten())
model.add(Dense(256))
model.add(BatchNormalization())
model.add(Activation("relu"))
model.add(Dropout(0.3))
#OUTPUT LAYER
model.add(Dense(10, activation='softmax'))model = Sequential()
  • Compile Model
optimizer = Adam()
model.compile(optimizer = optimizer, loss = "categorical_crossentropy", metrics=["accuracy"])
model.summary()
  • Train Model
NO_EPOCHS = 300
history = model.fit_generator(datagen.flow(X_train, y_train, batch_size=BATCH_SIZE),
shuffle=True,
epochs=NO_EPOCHS, validation_data = (X_val, y_val),
verbose = 1, steps_per_epoch=X_train.shape[0] // BATCH_SIZE)
  • Plot กราฟ
plot_accuracy_and_loss(history)
  • วัดค่า Accuracy จาก Test Dataset
score = model.evaluate(test_data, y_test,verbose=0)
print("Test Loss:",score[0])
print("Test Accuracy:",score[1])

จากกราฟ Loss ด้านบน เมื่อมีการ Train ทั้งหมด 300 Epoch โดยใช้เทคนิค Augmentation, Batch Normalization และ Dropout พบว่า Validation Loss ไม่พุ่งขึ้นจนเกิดปัญหา Overfitting เหมือนกับในการ Train แบบไม่ใช้ Dropout เมื่อวัดประสิทธิภาพการ Predict ด้วย Test Dataset ได้ค่า “Accuracy 93.65%” เลยยย

ก็จบไปแล้วนะคะกับการทำ Regularization ด้วยเทคนิค Augmentation, Batch Normalization และ Dropout ผิดพลาดประการใดขออภัยมา ณ ที่นี้ด้วยนะคะ^^

แหล่งอ้างอิง

ภาพจาก : https://www.pinterest.com/pin/547680004675833517/?nic_v2=1arOsNriO

--

--