Trong CNN, tích chập được thực hiện trên giá trị đầu vào của dữ liệu và kernel/filter để tạo ra một bản đồ đặc trưng feature map.. Tại mỗi node, mô hình thực hiện quá trình linear regres
Trang 1MÔN XỬ LÝ ẢNH
CONVOLUTIONAL NEURAL NETWORK
TP HỒ CHÍ MINH, THÁNG 06 NĂM 2020
Trang 2:
MỤC LỤC
1 Lý thuyết 3
1.1 Tổng quát 3
1.2 Convolutional Layers 3
1.3 Pooling Layers 4
1.4 Fully Connected Layers 5
1.5 Lớp Softmax 9
1.6 Một số hàm tối ưu (Optimizer) 10
2 Ví dụ minh họa 12
2.1 Import các thư viện 12
2.3 Reshape các bức dữ liệu 14
2.4 Biến đổi nhãn ngõ ra sang dạng ma trận One Hot Encoding 14
2.5 Xây dựng mô hình CNN 15
2.6 Huấn luyện tệp dữ liệu 16
2.7 Đánh giá khả năng dự đoán của mô hình qua đồ thị 17
2.8 Đánh giá mô hình 18
2.9 Dự đoán ảnh 18
3 Tài liệu tham khảo 19
Trang 3:
1 Lý thuyết
1.1 Tổng quát
Convolutional Neural Network (CNN) hay còn được gọi là mạng Nơ-ron tích chập được dùng để dạy thuật toán nhận diện đối tượng trong hình ảnh
CNNs được chia thành 3 chiều : rộng, cao, sâu Các Nơ- ron trong mạng không liên kết hoàn toàn với toàn bộ Nơ-ron kế đến mà chỉ liên kết tới một vùng nhỏ Cuối cùng, một tầng đầu ra được tối giản thành vec-tơ của giá trị xác suất
CNNs gồm 2 thành phần:
Phần tầng ẩn hay phần rút trích đặc trưng: Trong phần này, mạng sẽ tiếng hành tính toán hàng loạt phép tích chập (Convolutional layer) và phép hợp nhất (pooling) để phát hiện các đặc trưng [1]
Phần phân lớp: Tại phần này, một số lớp các liên kết đầy đủ (Fully Connected) sẽ đóng vai trò như một bộ phân lớp các đặc trưng đã rút trích trước đó.Tầng này sẽ đưa ra xác suất của một đối tượng trong hình.[1]
H1.1 Cấu trúc của CNN[1]
1.2 Convolutional Layers
Khối tích chập( convolution): Sử dụng phép hợp nhất của hai hàm tạo thành hàm thứ ba Trong
CNN, tích chập được thực hiện trên giá trị đầu vào của dữ liệu và kernel/filter để tạo ra một bản đồ đặc trưng (feature map)
Ta thực hiện phép tích chập bằng cách trượt kernel/filter theo kiểu dữ liệu đầu vào Tại mỗi vị trí,
ta tiến hành phép nhân ma trận và tính tổng để đưa vào feature map
Ở lớp đầu tiên, khối tích chập dùng để phát hiện cạnh thẳng đứng và cạnh nằm ngang, cạnh chéo,
…Việc cần dùng bao nhiêu kernel hay dùng những kernel gì sẽ do CNN tự tìm
Trang 4:
Dưới đây là ví dụ về việc nhận diện cạnh thẳng đứng:
H1.2 Vertical Edge Detection example
Tại khối tích chập, các thông số được sử dụng bao gồm:
Stride (S) : Khoảng cách giữa 2 kernel khi quét.Ví dụ với stride=1, kernel sẽ quét 2 ô ngay cạnh nhau Với stride=2, kernel sẽ quét ô số 1 và ô số 3, bỏ qua ô ở giữa Điều này nhằm tránh việc lặp lại giá trị ở các ô bị quét
Padding (P): Tăng thêm một số hàng và cột ( thường có giá trị bằng 0) để tránh việc giảm kích thước ở output cũng như để lấy thông tin ở các pixel ngoài cùng Có 2 loại padding là “valid” tức là padding =0 và “same” tức là padding để kích thước ngõ ra bằng kích thước ngõ vào
#filters (nc) : Số filter được sử dụng ở mỗi layers
f : kích thước của mỗi filter là f *f
H1.3 Các thông số của conv layers
1.3 Pooling Layers
Khối Pooling: Mục đích là làm giảm số parameters mà ta cần phải tính toán, từ đó giảm thời gian
tính toán Ngoài ra nó còn tránh overfitting
Trang 5:
Có 2 loại pooling: max pooling lấy giá trị lớn nhất trong một pooling window và mean pooling lấy giá trị trung bình trong một pooling window
Pooling hoạt động gần giống convolution, ở max pooling cửa sổ trượt qua từng giá trị của ma trận dữ liệu đầu vào, chọn ra giá trị lớn nhất nằm trong cửa sổ trượt
H1.4 Max pooling [1]
1.4 Fully Connected Layers
Neural Network
Mạng neural network hay mạng neural nhân tạo là một thuật toán của "Máy Học" và là một nhánh của "Học Sâu" lấy cảm hứng từ mạng neuron của con người Ở đó, lớp đầu tiên đưa các đặc tính vào mạng được gọi là Input Layer và lớp cuối cùng để đưa ra các giá trị dự đoán gọi là Output Layer Giữa 2 lớp Input và Output gồm 1 hay nhiều lớp ẩn khác giúp tăng khả năng học và dự đoán của mạng được gọi Hidden Layer Mỗi Layer là tập hợp gồm nhiều node khác nhau, các node của lớp trước được kết nối với toàn bộ các node của lớp sau Tại mỗi node, mô hình thực hiện quá trình linear regression (hồi quy tuyến tính):
Trong đó:
(i): mẫu thứ i của tập dữ liệu
[l]: lớp thứ l trong mạng
k: node thứ k trong lớp thứ l
Trang 6:
ak(i)[l-1]: ngõ ra của node thứ k của layer phía trước thuộc mẫu thứ i tức là ngõ vào của lớp đang xét
wk(i)[l].T: chuyển vị của ma trận tham số w của node thứ k lớp thứ l mẫu thứ i
bk(i)[l]: ma trận tham số b của node thứ k lớp thứ l mẫu thứ i
g(i)[l]: hàm kích hoạt của lớp thứ l mẫu thứ i
ak(i)[l]: ngõ ra của node thứ k của layer đang xét thuộc mẫu thứ i
Những phương trình này sẽ được sắp xếp các tham số theo từng lớp lại thành các ma trận để quá trình xử lí nhanh hơn Quá trình này được gọi là vector hoá (Vectorization)
Xét trên 1 mẫu:
Ma trận W có kích thước k x n, ma trận a[l-1]có kích thước n x 1, ba có kích thước ma trận k x 1
Z và a[l]có kích thước k x 1
Xét trên m mẫu:
Trang 7:
Sau khi vector hóa trên m mẫu, Z và a[l] từ kích thước k x 1 thành k x m
Sau khi tìm được y hàm mất mát(Loss Function) sẽ được tính toán để xác định sai số giữa dự đoán của mô hình với đầu ra thực tế
Toàn bộ quá trình xử lí như trên qua tất cả các node từ input layer đến output layer được gọi là
truyền xuôi (Forward Propagation) Sau đó quá trình truyền ngược (Back Propagation) được tính
toán để tìm đạo hàm của hàm Loss Fuction theo các tham số của từng lớp Quá trình Back Propagation này cũng được vector hoá
Từ đó quá trình Gradient Descent diễn ra để cập nhập lại các tham số W,b của từng lớp để khả năng dự đoán của mô hình tăng lên Vector hoá cũng được áp dụng cho quá trình này
Trong đó được gọi là tốc độ học (learning rate)
H1.4.quá trình Forwardpropagation và Backpropagation [3]
Trang 8:
H1.5.Phép Flatten chuyên tensor thành vector [2]
Trong mạng CNN, các quá trình trên thường được áp dụng ở các lớp cuối sau khi quá trình Flatten - quá trình làm phẳng lớp 2 chiều phía trước thành lớp 1 chiều - diễn ra Khi đó, các mạng này được gọi là Fully Connected, tức là các node của lớp trước kết nối hoàn toàn với node của lớp sau
H1.6.Mô tả đoạn thuật toán Neural Network được áp dụng trong mạng CNN trong mô hình CNN
LeNet-5.[3]
Trang 9:
1.5 Lớp Softmax
Sau khi mạng CNNs học qua các lớp phía trước, ta thu được vector đặc trưng Khi đó, cần dựa vào vector đặc trưng này để phân loại vào các lớp theo yêu cầu bài toán Hàm softmax là một
mô hình xác suất để với mỗi input x, tính được output ai thể hiện xác suất để input đó rơi vào lớp thứ
i
Hàm softmax có đầu vào là 1 vector, đầu ra là một vector có cùng số chiều ( ) :a z R n R n
có công thức là:
1
exp( )
, 1, 2,3,
exp( )
i
i C
j j
z
z
với C là số lớp ngõ ra Nhận xét:
- Giá trị zi càng lớn thì xác suất dữ liệu rơi vào lớp thứ i càng cao
- Các ai lớn hơn 0 và có tổng bằng 1
H1.7.Ví dụ về đầu vào và đầu ra của hàm softmax.[2]
Trang 10:
1.6 Một số hàm tối ưu (Optimizer)
1.6.1 Mini-batch
Với một tệp dữ liệu quá lớn việc huấn luyện tệp và tính Gradient Descent rất mất thời gian
Vì vậy thay vì huấn luyện toàn bộ tệp, người ta thường phân nhỏ các tệp ra thành các mini-batch Giả sử với một tệp 5.000.000 mẫu ta có thể phân nhỏ thành các mini-batch có kích thước 1000 mẫu
Trong đó, x(1) là mẫu thứ 1 của X , X{1} là mini-batch thứ 1 của X
Lựa chọn mini-batch thích hợp sẽ giúp quá trình vector hóa dữ liệu nhanh hơn do ít mẫu hơn
và không cần phải đợi toàn bộ quá trình xảy ra mà có thể dừng lại khi tỉ lệ dự đoán đã đạt yêu cầu
Các kích thước của mini-batch thường được chọn là : 64(26),128(27),256(28),1024(29) Các bước học với mini-batch gradient descent diễn ra như sau:
Quá trình trải qua toàn bộ các mini-batch này gọi là 1 "epoch"
Trang 11:
1.6.2 ADAM Optimizer
Thuật toán tối giản ADAM(Adaptive Moment Estimation) được xem như thuật toán tối giản tốt nhất khi kết hợp hai phương pháp Gradient Descent với động lực và RMS:
Quá trình ADAM diễn ra như sau:
Thêm quá trình "correct" để tránh sai sót do quá trình quá độ khi khởi tạo các giá trị ban đầu bằng 0, với các lần lặp t sau, quá trình "correct" cũng không ảnh hưởng lên quá nhiều vì βt với t lớn xấp xỉ bằng 0 nên VdWcorrect ≈ VdW
1.6.3 Categorical Crossentropy
Khi huấn luyện mô hình, để biểu thị chênh lệch giữa ngõ ra dự đoán và ngõ ra thực tế, ta sử dụng hàm mất mát (Loss function)
^
( , )
L y y .
( ,y)= log
K
k
y
oss cr
L
0
Hàm mất mát càng nhỏ thì độ chính xác càng cao Hàm mất mát được định nghĩa trong Keras là Categorical Crossentropy
Trang 12:
2 Ví dụ minh họa
2.1 Import các thư viện
H2.1 import các thư viện
import numpy as np: import thư viện numpy với kiểu truy cập thư viện là "np" Thư viện
numpy giúp ta có thể thao tác với các mảng đại số, thức hiện các phép toán liên quan đến đại số tuyến tính
import os: import module os để tương tác với hệ điều hành, cho phép chúng ta làm việc với các
thư mục và tệp tin
import matplotlib.pyplot as plt: import thư viện matplotlib với module pyplot với kiểu truy cập
là "plt" Thư viện và module này giúp ta thao tác trên đồ thị
from keras.models import Sequential: từ thư viện Keras import module models và trong
models import Sequential dùng để khởi tạo model
from keras.layers import Dense,Dropout, Activation, Flatten
from keras.layers import Conv2D, MaxPooling2D
2 lệnh trên từ thư viện Keras import model layers để xây dựng các layer cho mạng CNN Từ model layer import một số function để thao tác trên các layer CNN
Trang 13: H2.2 Kiến trúc Keras[4]
import keras.utils: Từ thư viện keras import module util chứa các function giúp ta thực hiện xử
lý dữ liệu nhanh hơn
from keras.datasets import mnist: Function mnist được dùng để tải dữ liệu.
2.2 Tải tập dữ liệu và phân chia tập training và tập validation
H2.3.Phân chia dữ liệu
Trang 14:
mnist.load_data(): Tải dữ liệu từ một nguồn có sẵn, sau đó dữ liệu được phân về 2 tập: tập Huấn
luyện - Training (X_train,y_train) và tập Kiểm tra - Test (X_test,y_test) Ở đây, tập training gồm
60000 mẫu và tập test gồm 10000 mẫu
Sau đó, từ tập training ta xác định tập Thẩm định – validation (X_val,y_val)
X_val,y_val = X_train[50000:60000,:],y_train[50000:60000]
X_train,y_train = X_train[:50000,:], y_train[:50000]
Sử dụng 50000 mẫu đầu tiên cho training còn 10000 mẫu còn lại được sử dụng cho validation 2.3 Reshape các bức dữ liệu
H2.4.Reshape các mẫu để phù hợp với đầu vào mạng CNN
X_train = X_train.reshape(X_train.shape[0],28,28,1): Làm phẳng 50000 mẫu là một ảnh kích
thước 28x28 thành một ma trận cột 4 chiều
Tương tự cho các tập validation và tập test
2.4 Biến đổi nhãn ngõ ra sang dạng ma trận One Hot Encoding
H2.5 Biến đổi ngõ ra
keras.utils.to_categorical(): Lệnh này được sử dụng để biến đổi từ ma trận chứa dữ liệu của các
nhãn sang dạng one-hot encoding
Trang 15:
2.5 Xây dựng mô hình CNN
H2.6 Xây dựng mô hình CNN
Sequential(): khởi tạo mô hình CNN
model.add(): thêm 1 lớp vào mạng CNN
Conv2D(number of filters ,kernel size ,activation=""):
Xây dựng lớp tích chập 2 chiều với:
number of filters: số lượng ma trận filter(kernel) lấy tích chập với mẫu
kernel size: kích thước ma trận filter(kernel)
activation: hàm kích hoạt sau khi lấy tích chập
Ở 2 lớp layer đầu sử dụng Conv2D(32,(3,3),activation='sigmoid') để xây mạng tích chập 2 chiều với số lượng ma trận filter là 32, kích thước ma trận là 3x3, hàm kích hoạt sau khi lấy tích chập là hàm sigmoid Kết thúc quá trình từ mẫu có kích thước ma trận 28x28x1 -> 26x26x32 -> 24x24x32
Maxpooling2D(pool_size=""): xây dựng lớp tích chập maxpool với pool_size là kích thước lấy
max pooling Ở lớp này sử dụng MaxPooling2D(pool_size="(2,2)) tức ta sẽ lấy max pooling với kích thước là 2x2 ở mẫu đầu vào Kết thúc quá trình từ mẫu có kích thước ma trận 24x24x32 -> 12x12x32
Flatten(): Lệnh này được sử dụng để làm phẳng layer 2 chiều phía trước như hình phía dưới Kết
thúc quá trình mẫu có kích thước ma trận 12x12x32 -> 4608x1
Dense(number of units,activation=""): Xây dựng một lớp fully connected với:
number of units: số units trong lớp full connected đó
activation: hàm kích hoạt sau
Trang 16:
Ở 2 lớp cuối Dense(128,activation="sigmoid"): Tạo 1 lớp fully connected với 128 units và
activation là hàm sigmoid Mẫu có kích thước ma trận 4608x1 thành 128x1
Dense(10,activation="softmax"): Tạo 1 lớp full connected với 10 units và activation là hàm
softmax xác định nhãn cho mẫu Mẫu có kích thước 128x10 xuống còn 10x1 để xác định y cho các nhãn
Compile(loss="",optimizer="",metrics=):Kết hợp tất cả các lớp được tạo ở trên thành mạng
CNN với loss để tính hàm tiêu hao, optimizer để tối ưu hóa, metrics để tìm độ chính xác của mô hình
Compile(loss="category_crossentropy", optimizer="adam",metrics=["accuracy"]) kết hợp
các lớp ở trên, hàm tiêu hao được tính cho bài multi classification, tối ưu hóa theo thuật toán ADAM
và tính thêm độ dự đoán chính xác với mô hình CNN
2.6 Huấn luyện tệp dữ liệu
H2.7 Huấn luyện mô hình CNN
model.fit(x, y, batch_size, validation_data, epochs, verbose):
Huấn luyện mô hình với số epoch cho trước:
x: mẫu huấn luyện
y: nhãn của mẫu huấn luyện
Trang 17:
batch_size: số mẫu trong một mini_batch
validation_data: dữ liệu kiểm chứng
epoch: số lần "epoch" - số lần quét qua toàn bộ mẫu
verbose=1: hiển thị thanh trạng thái quá trình huấn luyện
ngõ ra trả về quá trình diễn ra huấn luyện, thời gian huấn luyện, hàm hao phí, độ chính xác của tệp huấn luyện, hàm hao phí, độ chính xác của tệp kiểm định qua mỗi lần epoch
2.7 Đánh giá khả năng dự đoán của mô hình qua đồ thị
H2.8 Đánh giá mô hình qua đồ thị
plt.figure(): tạo một đồ thị mới
plt.plot(np.arrange(x1,x2),H.history,label):
biểu diễn dữ liệu với:
np.arrange(x1,x2): dữ liệu được biểu diễn trong khoảng x1 đến x2
H.history: dữ liệu được vẽ
label: gắn nhãn cho dữ liệu được vẽ
Trang 18:
plt.plot(np.arrange(0,numOfEpoch),H.history['loss'],label="training loss"): Vẽ dữ liệu hàm
mất mát của tệp huấn luyện trên 10 lần epoch và được gán nhãn là "training loss"
plt.tiltle(): Đặt tên cho biểu đồ
plt.xlabel(): Đặt tên cho trục x
plt.ylabel(): Đặt tên cho trục y
plt.legend(): Hiển thị chú thích các đường màu
2.8 Đánh giá mô hình
H2.9 Đánh giá mô hình dùng tập kiểm tra
model.evaluate(x,y,verbose): đánh giá mô hình với tệp kiểm tra
x: mẫu kiểm tra
y: nhãn của mẫu kiểm tra
verbose=0: không hiển thị quá trình
ngõ ra trả về (hàm mất mát của tập kiểm tra, độ chính xác khi kiểm tra)
2.9 Dự đoán ảnh
Trang 19:
H2.10 Dự đoán ảnh
plt.imshow(image,cmap): hiển thị hình ảnh với
image: ảnh cần hiển thị
cmap ="gray": ảnh hiển thị với thang đo mức xám
model.predict(sample): trả về ma trận y dự đoán khả năng có thể mà bức ảnh phù hợp với từng
nhãn
Ví dụ với mẫu thứ 100 mô hình dự đoán xác suất bức ảnh này thuộc nhãn 1(tức là dự đoán đây là
số 1) chỉ có 1.606795 x 10-7, thuộc nhãn 2 là 2.6708245 x 10-8và tương tự cho các nhãn tiếp theo
np.argmax(y_predict): trả về thứ tự của phần tử có giá trị cao nhất tức là có khả năng cao nhất.
Ở mẫu thứ 100 này nhãn số 6 có xác suất dự đoán là 9.9999988 x 10-11, vậy mẫu này được dự đoán mang nhãn số 6 tức là số 6
3 Tài liệu tham khảo
[1] Nguyễn Phúc Lương,(2017), “Ứng dụng Convolutional Neural Network trong bài toán phân loại ảnh”, Viblo
[2] [1]: Thor Pham Blog, (2018), "Tìm hiểu về thư viện Keras trong Deep Learning",
thorphamblog.github.io
[3] Andrew Ng., "Course 4 - Convolution Network", Coursera.