Visualizing Kernels and Feature Maps in Deep Learning Model (CNN)
Convolution เป็นแนวคิดเพื่อเพิ่มประสิทธิภาพให้แก่ Neural Network Model
CNN (Convolutional Neural Network) เป็นโครงสร้างภายใน Deep Learning Model ที่ใช้แนวคิดของ Convolution ในการทำงานกับข้อมูล 2 มิติ
ซึ่ง CNN ประกอบด้วย Kernel และผลลัพธ์จากทางคณิตศาสตร์ของ Kernel กับ Input Image ที่เรียกว่า Activation Map หรือ Feature Map โดยทั้ง Kernel และ Feature Map นั้นสามารถแสดงผลได้ด้วยภาพ
ในบทความนี้จะเป็นการทำ Create a Model with 2D CNN Layer และวาด Algorithm ของ Model
2D Convolutions Concept
เป็นการนำ Matrix ขนาดเล็กของ Kernel มา Slide ไปบน 2D Input Image (สีฟ้า)โดยขณะที่ทาบ Kernel บน Input Image จะทำการคูณค่าแต่ละ Pixel ของ Input Image กับ Kernel แล้วนำผลลัพธ์ทั้งหมดมาบวกกันเป็น 1 จุด Pixel ของ Feature Map (สีเขียว)
Photo by Irhum Shafkat
2D Convolutions Concept จะมีการสร้าง Feature Map ขึ้นมาด้วยการนำ Kernel Slide ไปบน Input Image จะใช้ Parameter น้อยกว่า Fully Connected Layer
Padding
เป็นการเสริมกรอบด้วยการเติม 0 (Zero Padding) รอบ ๆ ภาพเดิม เพราะในขณะที่มีการ Slide Kernel จะเห็นได้ว่า Pixel ตรงขอบภาพสีฟ้าจะไม่มีทางอยู่ตรงกลาง Kernel ตอนที่ทาบลงไป เพราะเราไม่สามารถขยาย Kernel ให้เลยออกไปนอกขอบของภาพ จึงทำให้ Feature Map ที่ได้มีขนาดเล็กกว่า Input Image เพื่อจะทำให้ Feature Map มีขนาดเท่ากับ Input Image และ Pixel ที่ขอบภาพอยู่ตรงกลาง Kernel ตอนที่ทาบลงไปจึงต้องมีการทำ Padding
Photo by Irhum Shafkat
Striding
เป็นกระบวนการในการทำ Convolution โดยการเลื่อนแผ่น Kernel ไปบน Input Image ซึ่งโดย Default ของ Convolution แล้ว Stride จะมีค่าเท่ากับ 1 คือจะมีการเลื่อน Kernel ไปบน Input Image ครั้งละ 1 Pixel การเพิ่มค่า Stride มากขึ้น จะทำให้การเลื่อมกันของ Kernel ตอนที่มีการทาบกับ Input Image และขนาดของ Feature Map ลดลง ถ้ากำหนด Stride เท่ากับ 2 แล้ว Kernel ขนาด 3x3 จะถูก Slide ข้าม Pixel ของ Input Image ขนาด 5x5 ทีละ 2 Pixel ทำให้ได้ Feature Map ขนาด 2x2
Photo by Irhum Shafkat
Pooling
เป็นวิธีการลดขนาดภาพโดยการทำ Max Pooling หรือ Average Pooling โดย Pooling จะเป็นกระบวนการทำงานภายนอก CNN Layer โดยทำการเลือกตัวแทนของภาพด้วยการหาค่ามากที่สุด หรือค่าเฉลี่ยจาก Pixel ใน Window ตามขนาดที่กำหนด เช่น ขนาด 2x2 ซึ่งจะทำให้มีการลดขนาดของภาพลงได้ครึ่งหนึ่ง
Photo by Irhum Shafkat
Multi-channel
ใช้จัดการกับ Input Image แบบ 3 Channel เช่นภาพสีในระบบ RGB จะต้องใช้ Kernel จำนวน 3 ตัว ในการ Slide ไปบน Input Image แต่ละ Channel ซึ่งเราเรียก Kernel ทั้ง 3 ตัวว่า Filter (ในที่นี้ 1 Filter ประกอบด้วย 3 Kernel)
Feature Map แต่ละ Version ขนาด 3x3 ที่เกิดจากการ Slide Kernel ไปบน Input Channel ขนาด 5x5 จะถูกนำมารวมกันเป็น Output Channel 1 Channel เพื่อจะส่งต่อไปยัง Neural Network Layer ถัดไป
Output Channel จะถูกนำมาบวกกับ Bias ในขั้นตอนสุดท้ายของกระบวนการทำ Convolution
การสร้าง Output Channel 1 Channel ตามภาพด้านบน จะต้องใช้ Filter 1 Filter ซึ่งแต่ละ Filter ก็จะประกอบด้วยจำนวน Kernel 3 Kernel ดังนั้นถ้าต้องการสร้าง Output Channel หลาย Channel เราจะต้องมีจำนวน Filter หลาย Filter
ในที่นี้ผมจะใช้ colab.research.google.com โดยใช้ GPU COLAB
Visualizing CNN
- import library ที่จำเป็น
from tensorflow.python.keras.layers import Dense,Flatten,Conv2D,Dropout,Activation,BatchNormalization,MaxPooling2Dfrom tensorflow.python.keras.models import Sequentialfrom tensorflow.keras.optimizers import Adamimport tensorflow as tffrom keras.models import Modelfrom keras.models import Sequentialfrom keras.layers import Dense, Dropout, Activationfrom keras.optimizers import SGDfrom tensorflow.keras.datasets import fashion_mnistfrom tensorflow.keras.utils import to_categoricalfrom tensorflow.keras.preprocessing.image import ImageDataGeneratorfrom tensorflow.keras.callbacks import ModelCheckpointfrom tensorflow.python.keras.models import load_modelfrom sklearn.model_selection import train_test_splitimport numpy as npimport matplotlib.pyplot as pltimport plotly.graph_objs as gofrom plotly import toolsimport plotlyimport cv2from keras.callbacks import ModelCheckpoint%matplotlib inline
- อ่านไฟล์ภาพ cat.jpg พร้อมกับแปลงระบบสีจาก BGR ซึ่งเป็นค่า Default ของ OpenCV Library เป็น RGB และ Plot ภาพ
cat = cv2.imread('/content/cat.jpg')cat.shapecat = cv2.cvtColor(cat, cv2.COLOR_RGB2BGR)plt.figure(dpi=100)plt.imshow(cat)cat.shape
Create a Model with 2D CNN Layer
นิยาม Model แบบ 2D Convolution โดยรับ Input Image ขนาด 1,440x1,080 Pixel แบบ 3 Channel โดยมี Filter ขนาด 3x3 จำนวน 3 Filter เพื่อนำไป Slide บน Input Image ของแต่ละ Channel
- ทดลองขยายมิติของภาพจาก 3 มิติเป็น 4 มิติ เพื่อเตรียมนำเข้า Predict Function
- ทดลอง predict Model โดยใช้ค่า Weight และ Bias แบบสุ่มในตอนเริ่มต้น โดยยังไม่มีการ Train Model
- นิยาม visualize_cat Function ที่รับภาพเป็น Matrix โดยขยายภาพเป็น 4 มิติ แล้ว Predict ภาพ ก่อนจะหดให้เหลือ 3 มิติเท่าเดิมเพื่อที่จะนำไป Plot ภาพ
- จากภาพด้านบน Model จะมีจำนวน Parameter = Filter + Bias
Parameter = (3 x 3 x 3 x 3) + 3 = 84 Parameter - ซึ่งจากการนิยาม Model โดยกำหนดจำนวน Filter ไว้ที่ 3 Filter ทำให้ได้ Output Channel ขนาด 1,438x1,078 ทั้งหมด 3 Channel ซึ่งขนาดของ Output Channel จะลดลงจากเดิม 1,440x1,080 Pixel เนื่องมาจากมีการ Slide Kernel ขนาด 3x3 ไปบน Input Image โดยไม่มีการทำ Padding
นิยาม Model แบบ 2D Convolution โดยรับ Input Image ขนาด 1440x1080 Pixel แบบ 3 Channel โดยมี Filter ขนาด 10x10 จำนวน 3 Filter เพื่อนำไป Slide บน Input Image แต่ละ Channel
- จากภาพด้านบน Model จะมีจำนวน Parameter = Filter + Bias
Parameter = (10 x 10 x 3 x 3) + 3 = 903 Parameter - ซึ่งจากการนิยาม Model โดยกำหนดจำนวน Filter ไว้ที่ 3 Filter ทำให้ได้ Output Channel ขนาด 1,431x1,071ทั้งหมด 3 Channel ซึ่งขนาดของ Output Channel จะลดลงจากเดิม 1,440x1,080 Pixel เนื่องมาจากมีการ Slide Kernel ขนาด 3x3 ไปบน Input Image โดยไม่มีการทำ Padding
นิยาม Model แบบ 2D Convolution โดยรับ Input Image ขนาด 1440x1080 Pixel แบบ 3 Channel โดยมี Filter ขนาด 3x3 จำนวน 1 Filter
- จากภาพด้านบน Model จะมีจำนวน Parameter = Filter + Bias
Parameter = (3 x 3 x 3 x 1) + 3 = 28 Parameter - ซึ่งจากการนิยาม Model โดยกำหนดจำนวน Filter ไว้ที่ 3 Filter ทำให้ได้ Output Channel ขนาด 1,438x1,037 ทั้งหมด 3 Channel ซึ่งขนาดของ Output Channel จะลดลงจากเดิม 1,440x1,080 Pixel เนื่องมาจากมีการ Slide Kernel ขนาด 3x3 ไปบน Input Image โดยไม่มีการทำ Padding
นิยาม Model แบบ 2D Convolution โดยรับ Input Image ขนาด 1440x1080 Pixel แบบ 3 Channel โดยมี Filter ขนาด 20x20 จำนวน 1Filter เพื่อนำไป Slide บน Input Image แต่ละ Channel
- จากภาพด้านบน Model จะมีจำนวน Parameter = Filter + Bias
Parameter = (20 x 20x 3 x 1) + 1= 1201 Parameter - ซึ่งจากการนิยาม Model โดยกำหนดจำนวน Filter ไว้ที่ 3 Filter ทำให้ได้ Output Channel ขนาด 1,421x1,061 ทั้งหมด 3 Channel ซึ่งขนาดของ Output Channel จะลดลงจากเดิม 1,440x1,080 Pixel เนื่องมาจากมีการ Slide Kernel ขนาด 3x3 ไปบน Input Image โดยไม่มีการทำ Padding
นิยาม Model แบบ 2D Convolution โดยรับ Input Image ขนาด 1440x1080 Pixel แบบ 3 Channel โดยมี Filter ขนาด 20x20 จำนวน 1 Filter และเพิ่ม ReLu Activation Function
- จากภาพด้านบน Model จะมีจำนวน Parameter = Filter + Bias
Parameter = (20 x 20x 3 x 1) + 1= 1201 Parameter - ซึ่งจากการนิยาม Model โดยกำหนดจำนวน Filter ไว้ที่ 3 Filter ทำให้ได้ Output Channel ขนาด 1,421x1,061 ทั้งหมด 3 Channel ซึ่งขนาดของ Output Channel จะลดลงจากเดิม 1,440x1,080 Pixel เนื่องมาจากมีการ Slide Kernel ขนาด 3x3 ไปบน Input Image โดยไม่มีการทำ Padding
นิยาม Model แบบ 2D Convolution โดยรับ Input Image ขนาด 1440x1080 Pixel แบบ 3 Channel โดยมี Filter ขนาด 3x3 จำนวน 1 Filter และเพิ่ม Max Pooling ขนาด 5x5
- จากภาพด้านบน Model จะมีจำนวน Parameter = Filter + Bias
Parameter = (3 x 3 x 3 x 1) + 1= 28Parameter - ซึ่งจากการนิยาม Model โดยกำหนดจำนวน Filter ไว้ที่ 3 Filter ทำให้ได้ Output Channel ขนาด 1,434x1,078 ทั้งหมด 3 Channel ซึ่งขนาดของ Output Channel จะลดลงจากเดิม 1,440x1,080 Pixel เนื่องมาจากมีการ Slide Kernel ขนาด 3x3 ไปบน Input Image โดยไม่มีการทำ Padding
นิยาม Model แบบ 2D Convolution โดยรับ Input Image ขนาด 1440x1080 Pixel แบบ 3 Channel โดยมี Filter ขนาด 3x3 จำนวน 1 Filter เพิ่ม Relu Activation Function และ Max Pooling ขนาด 5x5
- จากภาพด้านบน Model จะมีจำนวน Parameter = Filter + Bias
Parameter = (3 x 3 x 3 x 1) + 1= 28Parameter - ซึ่งจากการนิยาม Model โดยกำหนดจำนวน Filter ไว้ที่ 3 Filter ทำให้ได้ Output Channel ขนาด 1,438x1,078 ทั้งหมด 3 Channel ซึ่งขนาดของ Output Channel จะลดลงจากเดิม 1,440x1,080 Pixel เนื่องมาจากมีการ Slide Kernel ขนาด 3x3 ไปบน Input Image โดยไม่มีการทำ Padding
นิยาม Model แบบ 2D Convolution, ReLu Activation Function และ Max Pooling อย่างละ 2 Layer
- จากภาพด้านบน Model จะมีจำนวน Parameter = Filter + Bias
Parameter = [(3 x 3 x 3 x 1) + 1] + [(3 x 3) + 1] = 38 Parameter