19/09/2019, 06:37

Ứng dụng Convolutional Neural Network trong bài toán phân loại ảnh

Người viết: Nguyễn Phúc Lương Tiếp nối series về Machine Learning, hôm nay sẽ là 1 bài viết về Convolutional Neural Network. Nếu mọi người theo dõi series Machine Learning của mình, thì sẽ thấy nó khá … lủng củng, bởi tự dưng đang Supervised Learning, Unsupervised Learning, ...

Người viết: Nguyễn Phúc Lương

Tiếp nối series về Machine Learning, hôm nay sẽ là 1 bài viết về Convolutional Neural Network. Nếu mọi người theo dõi series Machine Learning của mình, thì sẽ thấy nó khá … lủng củng, bởi tự dưng đang Supervised Learning, Unsupervised Learning, rồi đến ứng dụng Machine Learning trong các bài toán thực tế. Thực chất mình cũng rất mong muốn làm thành 1 series đầy đủ, kiểu như khóa Machine Learning của Andrew Ng =)) Nhưng kiến thức bản thân có hạn, đồng thời các bài toán mình đưa ra bị ảnh hưởng khá nhiều bởi 1 khóa Deep Learning mà mình đang theo học, và hôm nay cũng là 1 bài toán như thế: Ứng dụng CNN trong bài toán phân loại ảnh (Image Classification).

Nếu các bạn làm việc với Deep Learning nhiều thì chắc không còn xa lạ gì với CNN. Đây là một Structure rất phổ biến và quen thuộc trong Deep Learning. CNN được ứng dụng nhiều trong Computer Vision, Recommender System, Natural Language Processing, … Ví dụ như tự động nhận diện khi chúng ta up một ảnh lên Facebook, hay khi tôi search một từ bất kì lên google search, ví dụ “Mèo” thì trong tab “Hình ảnh”, google sẽ hiển thị rất nhiều ảnh có mèo trong đó. Làm thế nào mà họ làm được điều đó. Vâng, tất nhiên là tôi không biết họ làm thế nào. Nhưng chúng ta hoàn toàn có thể làm được như họ với CNN. Ứng dụng của tôi ngày hơn này thì đơn giản hơn khá nhiều, đó là phân loại khuôn mặt, hiểu đơn giản là nhìn vào 1 bức ảnh thì nó phải “biết” đây là ai.

Kiến Thức Liên Quan

Mình sẽ tóm tắt một vài kiến thức mình sử dụng trong bài. Và để hiểu được các kiến thức này thì bạn nên có một quá trình làm việc với machine learning, deep learning hay CNN, bởi nếu nhắc lại tất cả các kiến thức trên thì bài viết này sẽ rất dài, mà lý thuyết lại không phải cái mà mình muốn tập trung ở đây. Đầu tiên, với Convolutional Neural Network, đây là một deep neural network artritecture. Hiểu đơn giản, nó cũng chính là một dạnh Artificial Neural Network, một Multiplayer Perceptron nhưng mang thêm 1 vài cải tiến, đó là Convolution và Pooling.

Convolution

Thực chất mình không biết phải giải thích khái niệm mới này trong CNN thế nào cho chính xác nhất. Theo ý hiểu của mình, convolution gồm 2 khái niệm khác là Convolution Filter và Convolutional Layer. Trong mạng neural network thông thường, từ input, ta cho qua các hidden layer rồi ra được output. Với CNN, Convolutional Layer cũng chính là hidden layer, khác ở chỗ, Convolutional Layer là một tập các feature map và mỗi feature map này là một bản scan của input ban đầu, nhưng được trích xuất ra các feature/đặc tính cụ thể. Scan như thế nào thì lại dựa vào Convolution Filter hay kernel. Đây là một ma trận sẽ quét qua ma trận dữ liệu đầu vào, từ trái qua phải, trên xuống dưới, và nhân tương ứng từng giá trị của ma trận đầu vào mà ma trận kernel rồi cộng tổng lại, đưa qua activation funciton (sigmoid, relu, elu, … ), kết quả sẽ là một con số cụ thể, tập hợp các con số này lại là 1 ma trận nữa, chính là feature map. Hãy nhìn vào ví dụ sau cho dễ hiểu: Tôi có 1 ma trận đầu vào input và 1 kernel 

Tôi sẽ quét kernel qua từng phần tử của input. Và tính toán như trên: nhân tương ứng, rồi cộng tổng kết quả, đưa qua activation function (ta bỏ qua bước này trong ảnh động biểu diễn dưới đây), ta thu được một giá trị tại feature map 

Thực hiện lần lượt cho đến hết.

Ở đây nhiều người sẽ thắc mắc: các giá trị của kernel lấy ở đâu ra. Vâng, tôi cũng không biết là lấy ở đâu ra, nhưng sở dĩ sinh ra các giá trị này là bởi ta muốn trích xuất một đặc tính / feature nào đó của input. Dựa vào đó sẽ thu được kernel tương ứng. Ví dụ, tôi apply 3 kernel để thu được 3 feature riêng biệt từ input ban đầu:

Convolution Sharpen

Convolution Edge Enhance

Convolution Edge Detect

Và cũng đừng lo việc phải tìm bao nhiêu kernel hay lưu các kernel về để dùng dần. Đó là việc của CNN, nó sẽ tự động tìm các kernel, tự dò ra các feature, It’s cool ha 

0