Chuyển đến nội dung chính

Hướng dẫn Mạng Nơ-ron Tích chập (CNN) với TensorFlow

Tìm hiểu cách xây dựng và triển khai Mạng Nơ-ron Tích chập (CNN) trong Python với TensorFlow Framework 2
Đã cập nhật 5 thg 10, 2026  · 15 phút đọc

Khám phá cùng AI

ChatGPTClaudePerplexity

Hãy tưởng tượng bạn ở trong sở thú và cố gắng nhận biết một con vật là báo gêpa hay báo hoa mai. Là con người, não bộ bạn có thể dễ dàng phân tích các đặc điểm cơ thể và khuôn mặt để đi đến kết luận hợp lý. Tương tự, Mạng Nơ-ron Tích chập (CNN) có thể được huấn luyện để thực hiện cùng nhiệm vụ nhận dạng, bất kể mẫu phức tạp đến đâu. Điều này khiến chúng trở nên mạnh mẽ trong lĩnh vực thị giác máy tính. 

Hướng dẫn CNN mang tính khái niệm này sẽ bắt đầu bằng tổng quan về CNN là gì và tầm quan trọng của chúng trong máy học. Sau đó, bạn sẽ được hướng dẫn triển khai CNN theo từng bước trong TensorFlow Framework 2.

CNN là gì?

Mạng Nơ-ron Tích chập (CNN hoặc ConvNet) là một thuật toán học sâu được thiết kế đặc thù cho mọi tác vụ mà nhận dạng đối tượng là then chốt như phân loại, phát hiện và phân đoạn ảnh.  Nhiều ứng dụng đời thực, như xe tự lái, camera giám sát và hơn thế nữa, đều sử dụng CNN. 

Tầm quan trọng của CNN

Có một số lý do khiến CNN quan trọng, như nêu dưới đây:

  • Không như các mô hình máy học truyền thống như SVM và cây quyết định cần trích xuất đặc trưng thủ công, CNN có thể tự động trích xuất đặc trưng ở quy mô lớn, giúp chúng hiệu quả. 
  • Các lớp tích chập khiến CNN bất biến theo phép tịnh tiến, nghĩa là chúng có thể nhận dạng mẫu và trích xuất đặc trưng bất kể vị trí, dù ảnh bị xoay, co giãn hay dịch chuyển.
  • Nhiều mô hình CNN tiền huấn luyện như VGG-16, ResNet50, Inceptionv3 và EfficientNet đã chứng minh đạt kết quả tối tân và có thể tinh chỉnh cho các tác vụ mới với lượng dữ liệu tương đối nhỏ. 
  • CNN cũng có thể dùng cho các bài toán phân loại không phải ảnh và không giới hạn ở xử lý ngôn ngữ tự nhiên, phân tích chuỗi thời gian và nhận dạng giọng nói.

Kiến trúc của một CNN

Kiến trúc của CNN cố gắng mô phỏng cấu trúc của các nơ-ron trong hệ thị giác của con người gồm nhiều lớp, mỗi lớp chịu trách nhiệm phát hiện một đặc trưng cụ thể trong dữ liệu.  Như minh họa trong hình dưới, một CNN điển hình gồm kết hợp của bốn lớp chính: 

  • Các lớp tích chập
  • Hàm tuyến tính chỉnh lưu (viết tắt là ReLU)
  • Các lớp gộp (pooling)
  • Các lớp kết nối đầy đủ 

Hãy cùng hiểu cách mỗi lớp này hoạt động qua ví dụ phân loại chữ số viết tay sau.

Kiến trúc CNN áp dụng cho nhận dạng chữ số

Các lớp tích chập

Đây là khối xây dựng đầu tiên của CNN. Đúng như tên gọi, nhiệm vụ toán học chính được thực hiện là tích chập, tức áp dụng một hàm cửa sổ trượt lên ma trận điểm ảnh biểu diễn một bức ảnh. Hàm trượt áp lên ma trận gọi là kernel hay filter, và hai thuật ngữ này có thể dùng thay thế cho nhau. 

Trong lớp tích chập, nhiều bộ lọc cùng kích thước được áp dụng, mỗi bộ lọc dùng để nhận ra một mẫu cụ thể từ ảnh, như độ cong của chữ số, các cạnh, toàn bộ hình dạng chữ số, v.v. 

Hãy xét một ảnh thang xám 32x32 của chữ số viết tay. Các giá trị trong ma trận chỉ nhằm mục đích minh họa.

Minh họa ảnh đầu vào và biểu diễn điểm ảnh

Cũng xét kernel dùng cho tích chập. Đó là ma trận kích thước 3x3. Trọng số của từng phần tử trong kernel được thể hiện trên lưới. Trọng số 0 thể hiện bằng ô màu đen và trọng số 1 bằng ô màu trắng. 

Chúng ta có phải tự tìm các trọng số này không? 

Trong thực tế, trọng số của các kernel được xác định trong quá trình huấn luyện mạng nơ-ron. 

Dùng hai ma trận này, ta có thể thực hiện phép tích chập bằng cách áp dụng tích vô hướng, và tiến hành như sau: 

  1. Áp ma trận kernel từ góc trên bên trái sang phải.
  2. Nhân từng phần tử tương ứng.  
  3. Cộng các giá trị tích lại.
  4. Giá trị thu được tương ứng với giá trị đầu tiên (góc trên bên trái) trong ma trận tích chập.
  5. Di chuyển kernel xuống theo kích thước bước trượt.
  6. Lặp lại từ bước 1 đến 5 cho đến khi phủ toàn bộ ma trận ảnh.

Kích thước ma trận tích chập phụ thuộc vào kích thước bước trượt. Bước trượt càng lớn, kích thước càng nhỏ.

Áp dụng phép tích chập với bước trượt 1 và kernel 3x3

Một tên gọi khác của kernel trong tài liệu là bộ phát hiện đặc trưng vì các trọng số có thể được tinh chỉnh để phát hiện các đặc trưng cụ thể trong ảnh đầu vào. 

Chẳng hạn: 

  • Kernel trung bình điểm ảnh lân cận có thể dùng để làm mờ ảnh đầu vào.
  • Kernel trừ lân cận dùng để phát hiện cạnh.

Càng nhiều lớp tích chập, lớp càng giỏi phát hiện các đặc trưng trừu tượng hơn. 

Hàm kích hoạt

Sau mỗi phép tích chập sẽ áp dụng hàm kích hoạt ReLU. Hàm này giúp mạng học được các quan hệ phi tuyến giữa các đặc trưng trong ảnh, nhờ đó mạng vững vàng hơn trong việc nhận diện các mẫu khác nhau. Nó cũng giúp giảm thiểu vấn đề tiêu biến gradient. 

Lớp gộp (Pooling)

Mục tiêu của lớp gộp là trích xuất những đặc trưng quan trọng nhất từ ma trận tích chập. Điều này được thực hiện bằng cách áp dụng các phép gom nhóm, giúp giảm kích thước bản đồ đặc trưng (ma trận tích chập), từ đó giảm bộ nhớ sử dụng khi huấn luyện mạng.  Pooling cũng hữu ích trong việc giảm quá khớp.

Các hàm gom nhóm phổ biến có thể áp dụng gồm: 

  • Max pooling là giá trị lớn nhất của bản đồ đặc trưng
  • Sum pooling là tổng tất cả giá trị của bản đồ đặc trưng
  • Average pooling là giá trị trung bình của tất cả các giá trị. 

Dưới đây là minh họa của mỗi ví dụ trước: 

Áp dụng max pooling với bước trượt 2 và bộ lọc 2x2

Hơn nữa, kích thước của bản đồ đặc trưng sẽ nhỏ dần khi áp dụng hàm pooling. 

Lớp pooling cuối cùng sẽ làm phẳng (flatten) bản đồ đặc trưng để lớp kết nối đầy đủ có thể xử lý. 

Các lớp kết nối đầy đủ

Đây là các lớp ở cuối mạng nơ-ron tích chập,  và  đầu vào của chúng là ma trận một chiều đã được làm phẳng do lớp pooling cuối cùng tạo ra. Các hàm kích hoạt ReLU được áp dụng để tạo tính phi tuyến. 

Cuối cùng, một lớp dự đoán softmax được dùng để tạo ra các giá trị xác suất cho mỗi nhãn đầu ra có thể có, và nhãn cuối cùng được dự đoán là nhãn có xác suất cao nhất. 

Dropout 

Dropout là một kỹ thuật chuẩn hóa nhằm cải thiện khả năng khái quát hóa của các mạng nơ-ron có nhiều tham số. Nó bao gồm việc ngẫu nhiên loại bỏ một số nơ-ron trong quá trình huấn luyện, buộc các nơ-ron còn lại phải học những đặc trưng mới từ dữ liệu đầu vào.  

Vì phần triển khai kỹ thuật sẽ dùng TensorFlow 2, phần tiếp theo nhằm cung cấp cái nhìn tổng quan về các thành phần khác nhau của khung này để xây dựng mô hình học sâu hiệu quả. 

TensorFlow Framework là gì?

Google phát triển TensorFlow vào tháng 11 năm 2015. Họ định nghĩa đây là một khung máy học mã nguồn mở cho mọi người vì nhiều lý do. 

Định nghĩa TensorFlow

  • Mã nguồn mở: phát hành theo giấy phép Apache 2.0. Điều này cho phép nhà nghiên cứu, tổ chức và lập trình viên đóng góp cho thư viện bằng cách xây dựng dựa trên đó mà không bị hạn chế. 
  • Khung máy học: nghĩa là có một tập hợp thư viện và công cụ hỗ trợ quá trình xây dựng mô hình máy học.
  • Dành cho mọi người: Sử dụng TensorFlow giúp việc triển khai các mô hình máy học trở nên dễ dàng hơn qua các ngôn ngữ phổ biến như Python. Hơn nữa, các thư viện tích hợp như Keras còn giúp việc tạo mô hình học sâu mạnh mẽ trở nên đơn giản hơn. 

Tất cả các chức năng này khiến TensorFlow là ứng viên tốt để xây dựng mạng nơ-ron. 

Hơn nữa, cài đặt TensorFlow 2 rất đơn giản và có thể thực hiện như sau bằng trình quản lý gói Python pip như giải thích trong tài liệu chính thức. 

Sau khi cài đặt, chúng ta có thể thấy phiên bản đang dùng là 2.9.1

import tensorflow as tf
print("TensorFlow version:", tf.__version__)

Giờ hãy khám phá sâu hơn các thành phần chính để tạo những mạng này. 

Tensors là gì?

Khi xây dựng các mô hình máy học và học sâu, chúng ta chủ yếu xử lý dữ liệu có số chiều lớn. Tensor là các mảng đa chiều với một kiểu dữ liệu thống nhất, dùng để biểu diễn các đặc trưng khác nhau của dữ liệu. 

Dưới đây là biểu diễn đồ họa các loại số chiều khác nhau của tensor. 

Minh họa tensor từ 0 đến 3 chiều

  • Tensor 0 chiều chứa một giá trị duy nhất.
  • Tensor 1 chiều, còn gọi là tensor “hạng-1”, là một danh sách giá trị. 
  • Tensor 2 chiều là tensor “hạng-2”.
  • Cuối cùng, ta có thể có tensor N chiều, nơi N là số chiều trong tensor. Ở các trường hợp trước, N lần lượt là 0, 1 và 2.

Dưới đây là minh họa từ tensor 0 đến 3 chiều. Mỗi tensor được tạo bằng hàm constant() của TensorFlow. 

# Zero dimensional tensor
zero_dim_tensor = tf.constant(20)
print(zero_dim_tensor)

# One dimensional tensor
one_dim_tensor = tf.constant([12, 20, 53, 26, 11, 56])
print(one_dim_tensor)

# Two dimensional tensor
two_dim_array = [[3, 6, 7, 5],
             	[9, 2, 3, 4],
             	[7, 1, 10,6],
             	[0, 8, 11,2]]

two_dim_tensor = tf.constant(two_dim_array)
print(two_dim_tensor)

Thực thi thành công đoạn mã trên sẽ tạo ra các đầu ra dưới đây, và ta có thể thấy từ khóa “tf.Tensor” để chỉ kết quả là một tensor. Nó có ba tham số:

  •  Giá trị thực tế của tensor.
  • Hàm shape() biểu thị hình dạng của tensor, lần lượt là 0, 6 theo 1, và 4 theo 4, tương ứng cho tensor thứ nhất, thứ hai và thứ ba.
  • Kiểu dữ liệu được biểu diễn bằng thuộc tính dtype, và tất cả các tensor đều là int32.

Ví dụ về tensor trong TensorFlow

Hướng dẫn TensorFlow cho người mới bắt đầu của chúng tôi cung cấp cái nhìn tổng quan đầy đủ về TensorFlow và cách xây dựng, huấn luyện mô hình.

Tensors so với Ma trận: Khác nhau ở đâu

Nhiều người nhầm lẫn tensor với ma trận. Dù hai đối tượng này trông giống nhau, chúng có thuộc tính hoàn toàn khác. Phần này giúp hiểu rõ hơn sự khác biệt giữa ma trận và tensor.

  • Ta có thể coi ma trận là tensor chỉ có hai chiều. 
  • Tensor, ngược lại, là dạng tổng quát hơn có thể có bất kỳ số chiều nào.

So với ma trận, tensor phù hợp hơn cho các bài toán học sâu vì các lý do sau: 

  • Chúng có thể xử lý bất kỳ số chiều nào, phù hợp hơn với dữ liệu đa chiều.
  • Khả năng của tensor tương thích với nhiều kiểu dữ liệu, hình dạng và số chiều khiến chúng linh hoạt hơn ma trận.
  • TensorFlow hỗ trợ GPU và TPU để tăng tốc tính toán. Dùng tensor, kỹ sư máy học có thể tự động tận dụng những lợi ích này.
  • Tensor hỗ trợ broadcasting một cách tự nhiên, tức thực hiện các phép toán giữa các tensor có hình dạng khác nhau, điều này không phải lúc nào cũng có thể khi xử lý ma trận.  

TensorFlow: Hằng, Biến và Placeholder

Hằng không phải là loại tensor duy nhất. Còn có biến và placeholder, tất cả đều là các khối xây dựng của đồ thị tính toán.

Đồ thị tính toán về cơ bản là biểu diễn một chuỗi các phép toán và luồng dữ liệu giữa chúng. 

Giờ hãy hiểu sự khác nhau giữa các loại tensor này.

Hằng số (Constants)

Hằng là các tensor có giá trị không đổi trong suốt quá trình thực thi đồ thị tính toán. Chúng được tạo bằng hàm tf.constant() và chủ yếu dùng để lưu trữ các tham số cố định không cần thay đổi trong quá trình huấn luyện mô hình.

Biến (Variables)

Biến là các tensor có giá trị có thể thay đổi trong quá trình thực thi đồ thị tính toán và được tạo bằng hàm tf.Variable(). Ví dụ, trong mạng nơ-ron, trọng số và độ lệch có thể được định nghĩa là biến vì cần cập nhật trong quá trình huấn luyện. 

Placeholder

Đây là các vùng chứa rỗng được dùng trong phiên bản đầu tiên của TensorFlow, không có giá trị cụ thể. Chúng chỉ dùng để dành chỗ cho dữ liệu sẽ được dùng sau. Điều này cho phép người dùng linh hoạt dùng các bộ dữ liệu và kích thước batch khác nhau trong huấn luyện và kiểm định mô hình.

Trong TensorFlow phiên bản 2, placeholder đã được thay thế bởi hàm tf.function(), là một cách tiếp cận Pythonic và động hơn để nạp dữ liệu vào đồ thị tính toán. 

Triển khai CNN theo từng bước

Hãy áp dụng mọi thứ đã học trước đó vào thực tế. Phần này minh họa triển khai đầu-cuối một mạng nơ-ron tích chập trong TensorFlow áp dụng cho bộ dữ liệu CIFAR-10, là một bộ dữ liệu tích hợp sẵn với các thuộc tính sau: 

  • Chứa 60.000 ảnh màu 32 x 32
  • Bộ dữ liệu có 10 lớp khác nhau
  • Mỗi lớp có 6000 ảnh
  • Tổng cộng có 50.000 ảnh huấn luyện 
  • Và tổng cộng 10.000 ảnh kiểm thử

Mã nguồn của bài viết có trên workspace của DataCamp

Kiến trúc của mạng

Trước khi đi vào triển khai kỹ thuật, hãy hiểu trước kiến trúc tổng thể của mạng sẽ được xây dựng. 

Kiến trúc mô hình sẽ được triển khai

  • Đầu vào của mô hình là tensor 32x32x3, lần lượt tương ứng với chiều rộng, chiều cao và số kênh. 
  • Chúng ta sẽ có hai lớp tích chập. Lớp đầu áp dụng 32 bộ lọc kích thước 3x3 và hàm kích hoạt ReLU. Lớp thứ hai áp dụng 64 bộ lọc kích thước 3x3
  • Lớp pooling thứ nhất áp dụng max pooling 2x2
  • Lớp pooling thứ hai cũng áp dụng max pooling 2x2
  • Lớp kết nối đầy đủ có 128 đơn vị và hàm kích hoạt ReLU
  • Cuối cùng, đầu ra có 10 đơn vị tương ứng với 10 lớp, và hàm kích hoạt là softmax để tạo phân phối xác suất.

Nạp bộ dữ liệu

Bộ dữ liệu tích hợp sẵn được nạp từ keras.datasets() như sau: 

(train_images, train_labels), (test_images, test_labels) = cf10.load_data()

Phân tích dữ liệu khám phá

Trong phần này, chúng ta chỉ tập trung hiển thị một số ảnh mẫu vì ta đã biết tỷ lệ từng lớp trong cả dữ liệu huấn luyện và kiểm thử. 

Hàm trợ giúp show_images() hiển thị mặc định 12 ảnh và nhận ba tham số chính: 

  • Ảnh huấn luyện
  • Tên các lớp
  • Và nhãn huấn luyện.
import matplotlib.pyplot as plt

def show_images(train_images,
            	class_names,
            	train_labels,
            	nb_samples = 12, nb_row = 4):
    
	plt.figure(figsize=(12, 12))
	for i in range(nb_samples):
    	plt.subplot(nb_row, nb_row, i + 1)
    	plt.xticks([])
    	plt.yticks([])
    	plt.grid(False)
    	plt.imshow(train_images[i], cmap=plt.cm.binary)
    	plt.xlabel(class_names[train_labels[i][0]])
	plt.show()

Giờ ta có thể gọi hàm với các tham số yêu cầu. 

class_names = ['airplane', 'automobile', 'bird', 'cat', 'deer',
           	'dog', 'frog', 'horse', 'ship', 'truck']

show_images(train_images, class_names, train_labels)

Thực thi thành công đoạn mã trên sẽ tạo ra các ảnh dưới đây. 

Ảnh mẫu từ dữ liệu huấn luyện

Tiền xử lý dữ liệu

Trước khi huấn luyện mô hình, ta cần chuẩn hóa giá trị điểm ảnh của dữ liệu về cùng một khoảng (ví dụ 0 đến 1). Đây là bước tiền xử lý phổ biến khi làm việc với ảnh nhằm đảm bảo tính bất biến theo tỷ lệ và hội tụ nhanh hơn trong quá trình huấn luyện. 

max_pixel_value = 255

train_images = train_images / max_pixel_value
test_images = test_images / max_pixel_value

Bên cạnh đó, ta nhận thấy các nhãn đang ở dạng phân loại như cat, horse, bird, v.v. Cần chuyển chúng sang dạng số để mạng nơ-ron có thể xử lý dễ dàng.

from tensorflow.keras.utils import to_categorical
train_labels = to_categorical(train_labels, len(class_names))
test_labels = to_categorical(test_labels, len(class_names))

Triển khai kiến trúc mô hình

Bước tiếp theo là triển khai kiến trúc mạng dựa trên mô tả trước đó. 

Đầu tiên, ta định nghĩa mô hình bằng lớp Sequential(), và mỗi lớp được thêm vào mô hình bằng hàm add(). 

from tensorflow.keras import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense

# Variables
INPUT_SHAPE = (32, 32, 3)
FILTER1_SIZE = 32
FILTER2_SIZE = 64
FILTER_SHAPE = (3, 3)
POOL_SHAPE = (2, 2)
FULLY_CONNECT_NUM = 128
NUM_CLASSES = len(class_names)

# Model architecture implementation
model = Sequential()
model.add(Conv2D(FILTER1_SIZE, FILTER_SHAPE, activation='relu', input_shape=INPUT_SHAPE))
model.add(MaxPooling2D(POOL_SHAPE))
model.add(Conv2D(FILTER2_SIZE, FILTER_SHAPE, activation='relu'))
model.add(MaxPooling2D(POOL_SHAPE))
model.add(Flatten())
model.add(Dense(FULLY_CONNECT_NUM, activation='relu'))
model.add(Dense(NUM_CLASSES, activation='softmax'))

Sau khi áp dụng hàm summary() cho mô hình, ta có bản tóm tắt toàn diện về kiến trúc với thông tin về từng lớp, kiểu lớp, dạng đầu ra và tổng số tham số có thể huấn luyện. 

Tóm tắt kiến trúc của mô hình

Huấn luyện mô hình

Cuối cùng, mọi tài nguyên đã sẵn sàng để cấu hình và kích hoạt quá trình huấn luyện mô hình. Việc này lần lượt được thực hiện bằng các hàm compile() và fit() nhận các tham số sau: 

  • Bộ tối ưu (Optimizer) chịu trách nhiệm cập nhật trọng số và độ lệch của mô hình. Ở đây, chúng ta dùng Adam. 
  • Hàm mất mát dùng để đo lỗi phân loại sai, và chúng ta dùng Crosentropy().
  • Cuối cùng, các thước đo (metrics) dùng để đánh giá hiệu năng mô hình; trong trường hợp này sẽ hiển thị accuracy, precision và recall.
from tensorflow.keras.metrics import Precision, Recall

BATCH_SIZE = 32
EPOCHS = 30

METRICS = metrics=['accuracy',
               	Precision(name='precision'),
               	Recall(name='recall')]

model.compile(optimizer='adam',
          	loss='categorical_crossentropy',
          	metrics = METRICS)

# Train the model
training_history = model.fit(train_images, train_labels,
                	epochs=EPOCHS, batch_size=BATCH_SIZE,
                	validation_data=(test_images, test_labels))

Đánh giá mô hình

Sau khi huấn luyện, ta có thể so sánh hiệu năng mô hình trên cả tập huấn luyện và kiểm thử bằng cách vẽ các thước đo trên bằng hàm trợ giúp show_performance_curve() trong không gian hai chiều. 

  • Trục ngang (x) là số epoch
  • Trục dọc (y) là hiệu năng tương ứng của mô hình. 
  • Đường cong biểu diễn giá trị của thước đo tại một epoch cụ thể.

Để trực quan tốt hơn, một đường đỏ dọc được kẻ qua điểm giao của giá trị hiệu năng huấn luyện và kiểm định cùng với giá trị tối ưu.

def show_performance_curve(training_result, metric, metric_label):
    
	train_perf = training_result.history[str(metric)]
	validation_perf = training_result.history['val_'+str(metric)]
	intersection_idx = np.argwhere(np.isclose(train_perf,
                                            	validation_perf, atol=1e-2)).flatten()[0]
	intersection_value = train_perf[intersection_idx]
    
	plt.plot(train_perf, label=metric_label)
	plt.plot(validation_perf, label = 'val_'+str(metric))
	plt.axvline(x=intersection_idx, color='r', linestyle='--', label='Intersection')
    
	plt.annotate(f'Optimal Value: {intersection_value:.4f}',
         	xy=(intersection_idx, intersection_value),
         	xycoords='data',
         	fontsize=10,
         	color='green')
            	 
	plt.xlabel('Epoch')
	plt.ylabel(metric_label)
	plt.legend(loc='lower right')

Sau đó, hàm được áp dụng cho cả độ chính xác (accuracy) và độ chính xác dương (precision) của mô hình.

show_performance_curve(training_history, 'accuracy', 'accuracy')

Độ chính xác của mô hình trên dữ liệu huấn luyện và kiểm định

show_performance_curve(training_history, 'precision', 'precision')

Độ chính xác dương của mô hình trên dữ liệu huấn luyện và kiểm định

Sau khi huấn luyện mô hình mà không tinh chỉnh hay tiền xử lý thêm, chúng ta thu được:  

  • Điểm accuracy 67,09%, nghĩa là mô hình phân loại đúng 67 mẫu trên mỗi 100 mẫu. 
  • Và precision 76,55%, nghĩa là trong mỗi 100 dự đoán dương tính, gần 77 là dương tính thật và 23 còn lại là dương tính giả. 
  • Các điểm số này đạt được lần lượt ở epoch thứ ba và thứ hai đối với accuracy và precision.

Hai thước đo này cho cái nhìn tổng quan về hành vi của mô hình. 

Nếu muốn biết với từng lớp, mô hình dự đoán tốt lớp nào và gặp khó khăn với lớp nào thì sao?

Điều này có thể thực hiện bằng ma trận nhầm lẫn, hiển thị với mỗi lớp số lượng dự đoán đúng và sai. Triển khai như dưới đây. Ta bắt đầu bằng dự đoán trên dữ liệu kiểm thử, sau đó tính ma trận nhầm lẫn và hiển thị kết quả cuối.

from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay

test_predictions = model.predict(test_images)

test_predicted_labels = np.argmax(test_predictions, axis=1)

test_true_labels = np.argmax(test_labels, axis=1)

cm = confusion_matrix(test_true_labels, test_predicted_labels)

cmd = ConfusionMatrixDisplay(confusion_matrix=cm)

cmd.plot(include_values=True, cmap='viridis', ax=None, xticks_rotation='horizontal')
plt.show()

Ma trận nhầm lẫn của mô hình

  • Các lớp 0, 1, 6, 7, 8, 9, lần lượt là airplane, automobile, frog, horse, ship, và truck có giá trị cao nhất ở đường chéo. Điều này nghĩa là mô hình dự đoán tốt hơn với các lớp đó. 
  • Ngược lại, mô hình có vẻ gặp khó khăn với các lớp còn lại:  
  • Các lớp có giá trị ngoài đường chéo cao nhất là những lớp mà mô hình hay nhầm với các lớp tốt. Ví dụ, mô hình nhầm birds (lớp 2) với airplane, và automobile với trucks (lớp 9).

Tìm hiểu thêm về ma trận nhầm lẫn trong hướng dẫn hiểu ma trận nhầm lẫn trong R của chúng tôi, lấy nội dung từ khóa học Machine Learning toolbox của DataCamp.

Mô hình này có thể cải thiện với các tác vụ bổ sung như:  

  • Tăng cường dữ liệu ảnh
  • Học chuyển giao bằng các mô hình tiền huấn luyện như ResNet, MobileNet hoặc VGG. Hướng dẫn học chuyển giao của chúng tôi giải thích học chuyển giao là gì và một số ứng dụng thực tế.
  • Áp dụng các kỹ thuật chuẩn hóa khác như L1, L2 hoặc dropout.  
  • Tinh chỉnh các siêu tham số khác nhau như tốc độ học, kích thước batch, số lớp trong mạng. 

Kết luận

Bài viết này đã bao quát tổng quan đầy đủ về CNN trong TensorFlow, cung cấp chi tiết về từng lớp trong kiến trúc CNN. Ngoài ra, bài viết cũng giới thiệu ngắn gọn về TensorFlow và cách công cụ này giúp kỹ sư, nhà nghiên cứu máy học xây dựng các mạng nơ-ron tinh vi. 

Chúng tôi đã áp dụng tất cả các kỹ năng này vào một kịch bản thực tế liên quan đến bài toán phân loại đa lớp.  

Hướng dẫn nhập môn phát hiện đối tượng của chúng tôi có thể là bước tiếp theo tuyệt vời để mở rộng kiến thức về thị giác máy tính. Bài viết khám phá các thành phần chính trong phát hiện đối tượng và giải thích cách triển khai trong SSD và Faster RCNN có sẵn trong TensorFlow.

Chủ đề
Python
Machine Learning
Học Sâu

Khóa học Python

Khóa học

Nhập môn Python

4 giờ
7.1M
Nắm vững phân tích dữ liệu với Python chỉ trong 4 giờ. Khóa học online này giúp bạn làm quen với giao diện Python và các thư viện phổ biến.
Xem chi tiếtRight Arrow
Bắt Đầu Khóa Học
Xem thêmRight Arrow
Liên quan

blog

Claude Opus 4.6: Tính năng, Điểm chuẩn, Bài kiểm tra thực hành và hơn thế nữa

Mô hình mới nhất của Anthropic dẫn đầu ở mã hóa tác tử và lập luận phức tạp. Thêm vào đó, nó có cửa sổ ngữ cảnh 1M.
Matt Crabtree's photo

Matt Crabtree

10 phút

Xem ThêmXem Thêm