Giới Thiệu Keras Và Bài Toán Phân Loại ảnh. - Deep Learning Cơ Bản

Bài trước đã giới thiệu về convolutional neural network (CNN) cho bài toán với input là ảnh. Bài này sẽ giới thiệu về thư viện keras và ứng dụng keras để xây dựng mô hình CNN cho bài toán phân loại ảnh.

Giới thiệu về keras

Bản chất của bài toán Deep learning: Bạn có dữ liệu, bạn muốn máy tính học được các mô hình (model) từ dữ liệu, sau đó dùng mô hình đấy để dự đoán được các dữ liệu mới. Các bước cơ bản làm một bài toán deep learning :

  • Xây dựng bài toán
  • Chuẩn bị dữ liệu (dataset)
  • Xây dựng model
  • Định nghĩa loss function
  • Thực hiện backpropagation và áp dụng gradient descent để tìm các parameter gồm weight và bias để tối ưu loss function.
  • Dự đoán dữ liệu mới bằng model với các hệ số tìm được ở trên

Bước xây dựng model thì áp dụng các kiến thức được trình bày trong bài neural network và convolutional neural network ta có thể xây dựng model hoàn chỉnh từ đầu bằng python. Tuy nhiên bước backpropagation trở nên phức tạp hơn rất rất nhiều. Khó để implement và tối ưu được tốc độ tính toán. Đấy là lý do các framework về deep learning ra đời với các đặc điểm:

  • Người dùng chỉ cần định nghĩa model và loss function, framework sẽ lo phần backpropagation.
  • Việc định nghĩa layer, activation function, loss function đơn giản hơn cho người dùng. Ví dụ để thêm layer trong neural network chỉ cần báo là layer có bao nhiêu node và dùng hàm activation gì.
  • Tối ưu việc tính toán trên CPU và GPU.
Các deep learning framework phổ biến. Nguồn: https://towardsdatascience.com/deep-learning-framework-power-scores-2018-23607ddf297a

Có thể thấy tensorflow là framework phổ biến nhất tuy nhiên tensorflow khá khó sử dụng cho người mới bắt đầu. Nên mình sẽ giới thiệu về keras: dễ sử dụng, thân thiện với người dùng nhưng đủ tốt để làm các bài toán về deep learning.

Keras là một framework mã nguồn mở cho deep learning được viết bằng Python. Nó có thể chạy trên nền của các deep learning framework khác như: tensorflow, theano, CNTK. Với các API bậc cao, dễ sử dụng, dễ mở rộng, keras giúp người dùng xây dựng các deep learning model một cách đơn giản.

MNIST Dataset

Xây dựng bài toán

Bạn có ảnh xám kích thước 28*28 của chữ số từ 1 đến 9 và bạn muốn dự đoán số đấy là số mấy. Ví dụ:

Dữ liệu đầu tiên trong MNIST dataset.

Chuẩn bị dữ liệu

MNIST là bộ cơ sở dữ liệu về chữ số viết tay, bao gồm 2 tập con: training set gồm 60.000 ảnh các chữ số viết tay và test set gồm 10.000 ảnh các chữ số.

Training set, test set là gì?

Giả sử bạn đang luyện thi đại học và bạn có 10 bộ đề để luyện thi. Nếu bạn học và chữa cả 10 đề một cách chi tiết thì bạn sẽ không thể ước lượng được điểm thi của bạn khoảng bao nhiêu, dẫn đến bạn không chọn được trường phù hợp. Thế là bạn nghĩ ra một giải pháp tốt hơn, trong 10 đề đấy chỉ lấy 8 đề học và chữa chi tiết thôi còn để 2 đề lại coi như là đề thi thật. Như vậy bạn có thể ước lượng điểm thi của mình bằng cách đánh giá điểm ở 2 đề đấy.

Trong ví dụ trên thì:

  • 8 đề ôn luyện được gọi là training set, có thể hiểu là dữ liệu dùng để dạy cho model học.
  • 2 đề để rành gọi là validation set, là để đánh giá xem model hiện tại có tốt không, thường được dùng để chỉnh các tham số của model.
  • đề thi đại học thật là test set, là để đánh giá xem model hoạt động với dữ liệu thực tế có tốt không.

Như vậy MNIST dataset có 60.000 dữ liệu ở training set ở trong MNIST, ta sẽ chia ra 50.000 dữ liệu cho training set và 10.000 dữ liệu cho validation set. Vẫn giữ nguyên 10.000 dữ liệu của test set.

Xây dựng model

Vì input của model là ảnh nên nghĩ ngay đến convolutional neural network (CNN).

Mô hình chung bài toán CNN: Input image -> Convolutional layer (Conv) + Pooling layer (Pool) -> Fully connected layer (FC) -> Output.

Model cho bài toán

Input của model là ảnh xám kích thước 28*28.

Softmax function

Giống như bài logistic regression, thay vì chỉ muốn kết quả là ảnh là số mấy, ta muốn dự đoán phần trăm của ảnh là số nào. Ví dụ: 90% ảnh là số 5, 1% ảnh là số 1,…

Nhắc lại bài neural network, ở mỗi layer sẽ thực hiện 2 bước: tính tổng linear các node ở layer trước và thực hiện activation function (ví dụ sigmoid function, softmax function). Do sau bước tính tổng linear cho ra các giá trị thực nên cần dùng softmax function dùng để chuyển đổi giá trị thực trong các node ở output layer sang giá trị phần trăm.

Vì mỗi ảnh sẽ thuộc 1 class từ 0 đến 9, nên tất cả sẽ có 10 class. Nên output layer sẽ có 10 node để tương ứng với phần trăm ảnh là số 0,1,..,9. Ví dụ: a_6 là xác xuất ảnh là số 5. (Sự khác biệt chỉ số do các số bắt đầu từ 0 trong khi chỉ số của node trong layer bắt đầu từ 1)

Softmax function

Tổng quát sau hàm activation: \displaystyle a_k = \frac{e^{z_k}}{\sum_{i=1}^{10} e^{z_i}}.

Nhận xét:

  • \displaystyle \sum_{i=1}^{10} a_i = 1
  • 0 < a_i < 1

Do đó ta có thể coi a_i là xác xuất ảnh là số (i-1).

Với các bài toán classification (phân loại) thì nếu có 2 lớp thì hàm activation ở output layer là hàm sigmoid, còn nhiều hơn 2 lớp thì hàm activation ở ouput layer là hàm softmax

=> Output layer có 10 nodes và activation là softmax function.

Loss function

Để định nghĩa loss function, trước hết ta dùng one-hot encoding chuyển đổi label của ảnh từ giá trị số sang vector cùng kích thước với output của model. Ví dụ:

Để ý là label của data là số i là vector v kích thước 10*1 với v_{i+1}= 1 và các giá trị khác bằng 0. So với quy ước về phần trăm ở trên thì one-hot encoding có ý nghĩa là ta chắc chắn 100% ảnh này là số 5.

Giờ ta có giá trị thật (label) dạng one-hot encoding giá trị dự đoán ở output layer sau hàm softmax function cùng kích thước 10*1. Ta cần định nghĩa hàm loss function để đánh giá độ tốt của model.

Mong muốn là a_6 gần 1 còn các giá trị a khác gần 0 vì như thế nghĩa là model dự đoán đúng được ảnh đầu vào là ảnh số 5. Ta định nghĩa loss function:

\displaystyle L = -\sum_{i=1}^{10} y_i * log(\hat{y_i})

Thử đánh giá hàm L. Giả sử ảnh là số 5 thì \displaystyle L = - log( \hat{y_6}).

Nhận xét:

  • Hàm L giảm dần từ 0 đến 1
  • Khi model dự đoán \hat{y_6} gần 1, tức giá trị dự đoán gần với giá trị thật y_6 thì L nhỏ, xấp xỉ 0
  • Khi model dự đoán \hat{y_6} gần 0, tức giá trị dự đoán ngược lại giá trị thật y_6 thì L rất lớn

=> Hàm L nhỏ khi giá trị model dự đoán gần với giá trị thật và rất lớn khi model dự đoán sai, hay nói cách khác L càng nhỏ thì model dự đoán càng gần với giá trị thật. => Bài toán tìm model trở thành tìm giá trị nhỏ nhất của L.

Hàm loss function định nghĩa như trên trong keras gọi là “categorical_crossentropy

Ứng dụng keras cho MNIST dataset

Code mọi người lấy ở đây và có thể dùng google colab (không cần cài đặt trên máy và có thể dùng được luôn) để chạy code với hướng dẫn sử dụng ở đây.

Ứng dụng của việc phân loại ảnh

  • Chuẩn đoán ảnh X-ray của bệnh nhân có bị ung thư hay không
  • Phân loại, nhận diện được các chữ, số viết tay => tự động đọc được biển số xe, văn bản.
  • Phân loại được các biển báo giao thông => hỗ trợ cho ô tô tự lái

Mọi người có thể luyện tập tự xây dựng model cho CIFAR10 dataset bao gồm 50,000 training set và 10.000 test set ảnh màu kích thước 32×32 cho 10 thể loại khác nhau (máy bay, ô tô, thuyền, chim, chó, mèo, ngựa,…).

# Load dữ liệu cifar10 from keras.datasets import cifar10 (x_train, y_train), (x_test, y_test) = cifar10.load_data() Bài 8: Ứng dụng CNN cho ô tô tự lái Bài 6: Convolutional neural network

Tags: giới thiệu về kerasimage classificationkerasmnist datasetphân loại ảnh

Từ khóa » Bộ Dữ Liệu Mnist