Giới thiệu
Nhận dạng chữ viết tay (Handwritten Digit Recognition) là một trong những bài toán kinh điển trong lĩnh vực học sâu (Deep Learning), được ứng dụng trong kiểm tra phiếu, đọc hóa đơn, nhập liệu tự động v.v.
Trong bài viết này, bạn sẽ được hướng dẫn từng bước xây dựng mô hình nhận dạng chữ số viết tay bằng TensorFlow và Keras, sử dụng dữ liệu MNIST – một tập dữ liệu tiêu chuẩn gồm hơn 60.000 ảnh chữ số từ 0 đến 9.
Chuẩn bị môi trường và cài đặt thư viện cần thiết
Bạn cần Python 3.8 trở lên và cài đặt các thư viện chính như:
pip install tensorflow pandas matplotlib scikit-learn
Nếu dùng GPU, bạn nên cài thêm tensorflow-gpu (với CUDA và cuDNN đúng version), nhưng với sinh viên thì train CPU cũng đủ cho các dự án nhỏ.
Tải và xử lý dữ liệu đầu vào
Bạn có thể dùng tập dữ liệu mẫu như MNIST, [Iris], hoặc dữ liệu CSV của riêng bạn.
Ví dụ: Phân loại chữ số viết tay từ tập dữ liệu MNIST
File: load_data.py
import tensorflow as tf # Tải dữ liệu MNIST (x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data() # Chuẩn hóa giá trị ảnh về [0,1] x_train = x_train / 255.0 x_test = x_test / 255.0 # Thêm 1 chiều channel vào input (từ (28,28) -> (28,28,1)) x_train = x_train[..., tf.newaxis] x_test = x_test[..., tf.newaxis]
Nếu bạn dùng dữ liệu ảnh riêng: cần resize về kích thước chuẩn và convert sang NumPy array hoặc dùng tf.data.
Xây dựng mô hình mạng nơ-ron bằng TensorFlow
Với Keras (API của TensorFlow), bạn có thể xây dựng mô hình rất gọn gàng:
File: model.py
from tensorflow.keras import layers, models
def build_model():
model = models.Sequential([
layers.Conv2D(32, (3,3), activation='relu', input_shape=(28,28,1)),
layers.MaxPooling2D((2,2)),
layers.Conv2D(64, (3,3), activation='relu'),
layers.MaxPooling2D((2,2)),
layers.Flatten(),
layers.Dense(64, activation='relu'),
layers.Dense(10, activation='softmax') # 10 lớp cho các chữ số từ 0-9
])
return model
Train mô hình và lưu kết quả huấn luyện
Sau khi xây dựng mô hình, bạn cần compile và train bằng .fit():
File: train.py
import tensorflow as tf
from load_data import x_train, y_train, x_test, y_test
from model import build_model
model = build_model()
# Compile mô hình
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
# Train mô hình
history = model.fit(x_train, y_train, epochs=5, validation_split=0.1, batch_size=32)
# Đánh giá
test_loss, test_acc = model.evaluate(x_test, y_test)
print(f"Độ chính xác tập test: {test_acc:.2f}")
# Lưu mô hình
model.save("model_mnist.h5")
Mỗi lần huấn luyện, bạn có thể lưu lịch sử (history) để vẽ biểu đồ loss/accuracy.
Trực quan hóa kết quả huấn luyện bằng đồ thị
Bạn nên thể hiện kết quả huấn luyện dưới dạng biểu đồ để đưa vào báo cáo.
File: train.py (thêm code dưới vào cuối file)
import matplotlib.pyplot as plt
def plot_history(history):
# Accuracy
plt.plot(history.history['accuracy'], label='Train Accuracy')
plt.plot(history.history['val_accuracy'], label='Val Accuracy')
plt.title('Độ chính xác qua các epoch')
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.legend()
plt.show()
# Loss
plt.plot(history.history['loss'], label='Train Loss')
plt.plot(history.history['val_loss'], label='Val Loss')
plt.title('Hàm mất mát qua các epoch')
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.legend()
plt.show()
Dự đoán một ảnh mới bằng mô hình đã train
Sau khi có mô hình đã lưu (model_mnist.h5), bạn có thể tải lại để sử dụng cho dự đoán.
File: predict.py
import tensorflow as tf
import numpy as np
from PIL import Image
# Load mô hình đã train
model = tf.keras.models.load_model("model_mnist.h5")
# Load ảnh cần dự đoán
img = Image.open("sample_digit.png").convert("L").resize((28,28))
img_array = np.array(img) / 255.0
img_array = img_array.reshape(1, 28, 28, 1)
# Dự đoán
prediction = model.predict(img_array)
print(f"Chữ số được dự đoán: {np.argmax(prediction)}")
Ảnh đầu vào cần là ảnh trắng đen, kích thước 28×28, giống định dạng MNIST.
Gợi ý thêm nếu dùng làm đồ án
Để đồ án trở nên ấn tượng hơn, bạn có thể mở rộng:
-
Thêm giao diện nhận ảnh hoặc text đầu vào (Streamlit, Flask)
-
Chuyển sang dữ liệu thực tế: ảnh bệnh, phân loại cảm xúc, dự đoán kết quả học tập
-
So sánh các kiến trúc CNN, RNN, hoặc thử thêm Dropout, BatchNormalization
-
Đánh giá mô hình bằng confusion matrix, ROC-AUC
-
Triển khai lên web, cloud (Google Colab, Heroku, Render)
Kết luận
Việc train mô hình bằng TensorFlow không quá khó nếu bạn làm đúng từng bước: xử lý dữ liệu, xây dựng mô hình, huấn luyện, đánh giá, và triển khai.
Dự án phân loại ảnh chữ số như MNIST chính là ví dụ điển hình để bạn luyện tập TensorFlow, và có thể dùng làm phần cốt lõi trong đồ án tốt nghiệp.

