AI Cho Mọi Người

AI Cho Mọi Người

Thiết kế kiến trúc CNN dùng Tensorflow

 

 

 

Trong bài học này, chúng ta sẽ học qua cách cài đặt CNN dùng Tensorflow. Cụ thể hơn, chúng ta sẽ sử dụng các hàm trong tf.keras để cài đặt tầng convolutional, activation, pooling, và fully connected.

 

Trước khi đọc tiếp, nếu bạn nào chưa sử dụng Colab thành thạo, các bạn có thể  tham khảo ở link sau để tìm hiểu hơn về Colab.

 

Tầng convolutional và activation

Module tf.keras cung cấp class Conv2D để cài đặt convolutional và activation. Xét ví dụ sau

Conv2D(filters=16, kernel_size=5, activation='relu')

Ở đây, bước convolutional được tính với filter size 5x5xK, trong đo K là chiều sâu của input (có thể là ảnh input hay feature map từ layer trước). Tham số padding không được chỉ định, nên kích thước của feature map đầu ra giảm 4.

Tham số filters=16 có nghĩa rằng có 16 filter khác nhau được dùng trong bước convolutional. Do đó, tổng số tham số (trọng số học trong quá trình training) là 16x5x5xK (cộng 1 cho tham số bias, được thêm vào tự động). Sau khi thực hiện bước convolutional, hàm activation ReLU được thực hiện (activation='relu').

Trong trường hợp chúng ta muốn kích thước của feature map đầu ra không thay đổi, chúng ta dùng tham số padding='same'.

 

Tầng pooling

Chúng ta sử dụng class MaxPooling2D để thực hiện max-pooling và class AveragePooling2D để thực hiện average-pooing. Ví dụ, đoạn code sau thực hiện max-pooling với size là 2x2.

MaxPooling2D(pool_size=2)

 

Tầng fullly connected

Giống với MLP học trong tuần trước, chúng ta dùng class Dense để tạo các tầng fully connected. Ví dụ chúng ta tạo tầng fully connected dùng class Dense như sau

Dense(10, activation='softmax')

Ở đây, layer có 10 node và hàm activation là softmax. Input cho tầng fully connnected là tensor ở dạng 1D. Do đó, bước flattening cần được thực hiện để chuyển đổi tensor ở dạng nhiều chiều sang tensor 1D. Bước flattening được cài đặt trong tf.keras với class Flatten().

 

Xây dựng kiến trúc CNN dùng Tensorflow

Trong phần này, chúng ta sẽ cài đặt kiến trúc CNN dựa vào yêu cầu cho trước.

Ví dụ 1: Xây dựng kiến trúc CNN được mô tả trong hình sau.

Hình input có shape là 28x28x1 (hình grayscale). Tầng convolution 1  có shape của feature map đầu ra (shape của feature map sau khi thực hiện xong bước convolution) là 28x28x6 và tầng convolution 2 có shape là 10x10x16. Hai tầng max-pooling với size=2x2. Ví dụ này luôn dùng stride S=1 cho mọi tầng, và activation được dùng là ReLU.

Xét chi tiết hơn convolution 1. Shape đầu vào là 28x28x1 và shape đầu ra là 28x28x6, trong đó chiều sâu của hai feature map lần lượt là 1 và 6. Chúng ta nhận thấy kích thước hai tensor không thay đổi, nên kỹ thuật padding được sử dụng. Trong trường hợp padding không được sử dụng, với filter size là 5x5 thì shape đầu ra là 24x24x6.

Mô hình có ba tầng fully connected với số node lần lượt là 120, 84, và 10. Feature map đầu ra từ tầng max-pooling 2 được flatten để đưa về dạng 1D và làm input cho tầng fully connected đầu.

Source code cài đặt kiến trúc CNN trên.

# LeNet-like
import tensorflow as tf

# model architecture
model = tf.keras.Sequential()

# input shape (28,28,1), convolution 1
model.add(tf.keras.layers.Conv2D(filters=6, kernel_size=3, padding='same', activation='relu', input_shape=(28,28,1))) 

# max pooling 1
model.add(tf.keras.layers.MaxPooling2D(pool_size=2))

# convolution 2
model.add(tf.keras.layers.Conv2D(filters=16, kernel_size=5, activation='relu'))

# max pooling 2
model.add(tf.keras.layers.MaxPooling2D(pool_size=2))

# Flatten
model.add(tf.keras.layers.Flatten())

# fully connected
model.add(tf.keras.layers.Dense(120, activation='relu'))
model.add(tf.keras.layers.Dense(84, activation='relu'))
model.add(tf.keras.layers.Dense(10, activation='softmax'))

# Take a look at the model summary
model.summary()

Kết quả summary mô hình CNN.

Tầng convolution 1 dùng  6 filter với size = 5x5x1. Do đó, tổng số tham số ở tầng này là 6x5x5 + 6 = 156 (mỗi filter kèm 1 bias). Các tầng max-pooling và flatten không có tham số nào. Tầng fully connected  cuối cùng có 10 node, kết nối với tầng phía trước có 84 node (cộng với 1 node bias). Do đó, tổng số tham số ở tầng này là (84+1)x10 = 850.

 

Ví dụ 2: Xây dựng kiến trúc CNN (VGG16) được mô tả trong hình sau.

Các thể hiện kiến trúc CNN như hình trên cách rất phổ biến. Chúng ta cùng làm quen và học cách đọc hiểu kiến trúc CNN từ hình trên. Cho trước thông tin tất cả filter dùng size = 3x3 và max-pooling với size = 2x2.

Input đầu vào có shape = 224x224x3. CNN có 16 layer convolution và fully connected. Trong ba tầng fully connected, hai tầng đầu có số node là 4096 và tầng cuối có số node là 1000. Ở hình mô tả này, activation softmax được áp dụng cho đầu ra từ tầng fully connected cuối cùng, và được biểu diễn như là một layer độc lập như max-pooling.

Source code cài đặt kiến trúc CNN trên.

# VGG16

import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Activation, Dropout, Flatten
from tensorflow.keras.layers import Conv2D
from tensorflow.keras.layers import MaxPooling2D

input_shape = (224, 224, 3)

#model
model = Sequential([
                Conv2D(64, (3, 3), input_shape=input_shape, padding='same', activation='relu'),
                Conv2D(64, (3, 3), activation='relu', padding='same'),
                MaxPooling2D(pool_size=(2, 2), strides=(2, 2)),
                Conv2D(128, (3, 3), activation='relu', padding='same'),
                Conv2D(128, (3, 3), activation='relu', padding='same',),
                MaxPooling2D(pool_size=(2, 2), strides=(2, 2)),
                Conv2D(256, (3, 3), activation='relu', padding='same',),
                Conv2D(256, (3, 3), activation='relu', padding='same',),
                Conv2D(256, (3, 3), activation='relu', padding='same',),
                MaxPooling2D(pool_size=(2, 2), strides=(2, 2)),
                Conv2D(512, (3, 3), activation='relu', padding='same',),
                Conv2D(512, (3, 3), activation='relu', padding='same',),
                Conv2D(512, (3, 3), activation='relu', padding='same',),
                MaxPooling2D(pool_size=(2, 2), strides=(2, 2)),
                Conv2D(512, (3, 3), activation='relu', padding='same',),
                Conv2D(512, (3, 3), activation='relu', padding='same',),
                Conv2D(512, (3, 3), activation='relu', padding='same',),
                MaxPooling2D(pool_size=(2, 2), strides=(2, 2)),
                Flatten(),
                Dense(4096, activation='relu'),
                Dense(4096, activation='relu'),
                Dense(1000, activation='softmax')
])

model.summary()

 

Kết quả summary mô hình CNN.

 

Bài tập: Các bạn hãy phân tích và tính tay số lượng tham số của từng layer và so sánh với bảng tóm tắt kiến trúc CNN ở trên.