Share This Article
1. Giới thiệu về Mạng Nơ-ron Dạng Tiến (FNN)
1.1. Mạng Nơ-ron Dạng Tiến là gì?
Mạng nơ-ron dạng tiến (Feedforward Neural Network – FNN) là loại mạng nơ-ron nhân tạo cơ bản nhất, trong đó dữ liệu chỉ di chuyển theo một hướng:
- Từ lớp đầu vào → các lớp ẩn → lớp đầu ra.
- Không có vòng lặp hay kết nối ngược lại.
Ví dụ đơn giản:
- Một hệ thống phân loại email thành spam hoặc không spam.
- Một mô hình dự đoán giá nhà dựa trên diện tích, số phòng ngủ.
1.2. Cấu trúc của FNN
Mạng FNN gồm ba loại lớp chính:
- Lớp đầu vào (Input Layer): Nhận dữ liệu đầu vào (ví dụ: ảnh, văn bản, số liệu).
- Lớp ẩn (Hidden Layers):
+ Xử lý và trích xuất đặc trưng từ dữ liệu.
+ Có thể có nhiều lớp để học sâu hơn.
- Lớp đầu ra (Output Layer): Cung cấp kết quả cuối cùng (ví dụ: dự đoán spam hay không spam).
1.3. Cách hoạt động của FNN
Bước 1: Truyền dữ liệu qua các lớp (Forward Propagation)
- Mỗi nơ-ron nhận đầu vào, nhân với trọng số (weights), cộng với hệ số điều chỉnh (bias), rồi tính toán thông qua hàm kích hoạt.
Bước 2: Tính toán sai số (Loss Function)
- So sánh kết quả dự đoán với nhãn thực tế để tính lỗi.
Bước 3: Cập nhật trọng số (Backpropagation)
- Dùng thuật toán Lan truyền ngược (Backpropagation) để cập nhật trọng số, giúp mô hình học tốt hơn.
Quá trình này lặp lại hàng nghìn lần để mô hình đạt độ chính xác cao.
2. Hướng dẫn Code FNN bằng Python
Chúng ta sẽ xây dựng một Mạng Nơ-ron Dạng Tiến đơn giản để phân loại chữ số viết tay (MNIST dataset) bằng TensorFlow & Keras.
2.1. Cài đặt thư viện cần thiết
Trước tiên, cần cài đặt TensorFlow nếu bạn chưa có:
1 |
pip install tensorflow |
2.2. Import các thư viện
1 2 3 4 5 |
import tensorflow as tf from tensorflow import keras import numpy as np import matplotlib.pyplot as plt from keras.datasets import mnist |
2.3. Tải dữ liệu MNIST (Chữ số viết tay)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# Tải dataset MNIST từ Keras (X_train, y_train), (X_test, y_test) = mnist.load_data() # Chuẩn hóa dữ liệu về khoảng [0, 1] X_train, X_test = X_train / 255.0, X_test / 255.0 # Hiển thị một số hình ảnh mẫu plt.figure(figsize=(10, 5)) for i in range(10): plt.subplot(2, 5, i + 1) plt.imshow(X_train[i], cmap='gray') plt.axis('off') plt.show() |
Giải thích:
- Dữ liệu MNIST chứa 60,000 ảnh huấn luyệnvà 10,000 ảnh kiểm tra.
- Ảnh là 28×28 pixel, mỗi pixel có giá trị từ 0-255, ta chuẩn hóa về [0,1]để tăng hiệu quả học.
2.4. Xây dựng Mô Hình mạng Nơ-ron FNN
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# Xây dựng mô hình FNN với Keras Sequential API model = keras.Sequential([ keras.layers.Flatten(input_shape=(28, 28)), # Biến đổi ảnh 28x28 thành vector 784 keras.layers.Dense(128, activation='relu'), # Lớp ẩn 1 với 128 nơ-ron, dùng hàm ReLU keras.layers.Dense(64, activation='relu'), # Lớp ẩn 2 với 64 nơ-ron keras.layers.Dense(10, activation='softmax') # Lớp đầu ra với 10 lớp (0-9), dùng softmax ]) # Compile mô hình model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) # In cấu trúc mô hình model.summary() |
Giải thích:
- Flatten(): Biến ảnh 2D thành vector 1D để đưa vào mô hình.
- Dense(128, activation=’relu’): Lớp ẩn với 128 nơ-ron, dùng hàm kích hoạt ReLU.
- Dense(10, activation=’softmax’): Lớp đầu ra với 10 lớp (tương ứng các chữ số 0-9)
2.5. Huấn luyện mô hình
1 2 |
# Huấn luyện mô hình model.fit(X_train, y_train, epochs=10, validation_data=(X_test, y_test)) |
Kết quả huấn luyện
Giải thích:
- epochs=10: Mô hình sẽ chạy qua dữ liệu 10 lầnđể học tốt hơn.
- validation_data: Kiểm tra độ chính xác trên tập test sau mỗi epoch.
2.6. Kiểm tra độ chính xác của mô hình
1 2 |
test_loss, test_acc = model.evaluate(X_test, y_test) print(f"Độ chính xác trên tập kiểm tra: {test_acc:.2%}") |
Kết quả kiểm tra độ chính xác
Kỳ vọng: Mô hình đạt độ chính xác khoảng 97% trên tập kiểm tra.
2.7. Dự đoán một số Ảnh
1 2 3 4 5 6 7 8 9 10 11 12 |
# Dự đoán trên tập test predictions = model.predict(X_test) # Hiển thị một số dự đoán plt.figure(figsize=(10, 5)) for i in range(5): plt.subplot(2, 5, i + 1) plt.imshow(X_test[i], cmap='gray') plt.axis('off') predicted_label = np.argmax(predictions[i]) plt.title(f"Dự đoán: {predicted_label}") plt.show() |
Kết quả dự đoán một số hình ảnh
Giải thích:
- predict(X_test): Dự đoán chữ số trên ảnh test.
- argmax(): Lấy nhãn có xác suất cao nhất.
3. Kết luận
Mạng nơ-ron dạng tiến (FNN) là kiến trúc cơ bản trong học sâu nhưng vẫn rất mạnh mẽ trong nhiều bài toán.
Bạn có thể mở rộng mô hình bằng cách tăng số lớp ẩn hoặc thử nghiệm với kiến trúc phức tạp hơn như CNN!