Bài Tập 2 · CO5085 · 2025–2026 HK2

Phân loại ảnh với các mô hình học sâu cơ bản

Xây dựng và so sánh các mô hình phân loại ảnh trên CIFAR-100 từ đơn giản đến phức tạp.

📋 Nội Dung Bài Tập

5 phần theo yêu cầu đề bài — dataset: CIFAR-100 (100 lớp, 32×32, 50K train)
1
Phần 1 — Xây dựng 4 mô hình cơ bản
Softmax Regression · MLP · SimpleCNN · SimpleViT (PyTorch TransformerEncoder)
✅ Done
2
Phần 2 — Training loop tự viết & So sánh
forward → loss → backward → clip → step · Bảng + biểu đồ so sánh 4 mô hình
✅ Done
3
Phần 3 — Custom TransformerEncoder từ đầu
Chỉ dùng nn.Linear, LayerNorm, einsum · Custom ViT vs PyTorch ViT
✅ Done
4
Phần 4 — Kiến trúc kết hợp và Tokenization
CNN+Transformer · Spatial tokens (H×W) · Channel tokens (C) · So sánh 3 cách
✅ Done
5
Phần 5 — LSTM/GRU cho phân loại ảnh
Row-wise · Patch4-wise · LSTM vs GRU bidirectional · So sánh 4 cấu hình
✅ Done

🏗️ Các Mô hình Đã Xây dựng

12 mô hình — train từ đầu trên CIFAR-100, không dùng pretrained
Phần 1
Softmax Regression
Flatten → Linear(3072→100). Mô hình tuyến tính đơn giản nhất.
Phần 1
MLP
Flatten → FC(512) → FC(256) → FC(100) + BN + Dropout.
Phần 1
SimpleCNN
3 ConvBlocks (32→64→128) + AdaptiveAvgPool + Classifier.
Phần 1 & 3
SimpleViT (PyTorch)
64 patches 4×4, d=128, 4 heads, 4 layers dùng nn.TransformerEncoder.
Phần 3
CustomViT
Cùng kiến trúc SimpleViT nhưng dùng CustomTransformerEncoder tự xây với einsum.
Phần 4
CNN+Transformer
CNN backbone → 64 spatial feature tokens → 2-layer Transformer.
Phần 4
SpatialToken ViT
1024 pixel tokens (H×W positions), d=64, 2 layers. O(1024²) attention.
Phần 4
ChannelToken ViT
64 channel tokens (C-axis), spatial features projected to d=128.
Phần 5
LSTM-row
BiLSTM, seq=(32 rows, 96 features), hidden=256, 2 layers.
Phần 5
LSTM-patch4
BiLSTM, seq=(64 patches 4×4, 48 features), hidden=256.
Phần 5
GRU-row
BiGRU, seq=(32 rows, 96 features), hidden=256. Đơn giản hơn LSTM.
Phần 5
GRU-patch4
BiGRU, seq=(64 patches 4×4, 48 features), hidden=256.

📊 Kết Quả Thực Nghiệm

Cập nhật: 28/03/2026 · Train từ đầu trên CIFAR-100 · Không dùng pretrained weights
Phần 1 & 2 — 4 mô hình cơ bản
Mô hìnhKiến trúcTest AccVal AccF1-macroParams
SoftmaxRegressionLinear7.94%8.34%6.09%307.3K
MLPFully Connected20.63%20.68%18.31%1.7M
SimpleCNNConvolutional35.88%36.38%34.48%346.6K
SimpleViTTransformer (PyTorch)24.47%25.54%22.35%821.0K
Phần 3 — Custom TransformerEncoder
Mô hìnhEncoderTest AccVal AccF1-macroParams
SimpleViTnn.TransformerEncoder31.92%33.00%30.39%821.0K
CustomViTCustom (einsum)34.56%35.80%33.11%819.4K
Phần 4 — Kiến trúc kết hợp và Tokenization
Mô hìnhCách TokenizeSeq LenTest AccF1-macroParams
CNN+TransformerCNN feature positions6437.25%35.87%446.1K
SpatialToken ViTH×W pixel positions102413.10%9.86%172.4K
ChannelToken ViTC channels6417.56%15.29%549.5K
Phần 5 — LSTM/GRU
Mô hìnhSeq ModeT (steps)D (features)Test AccF1-macroParams
LSTM (Bidirectional)Row-wise329629.36%28.34%2.4M
LSTM (Bidirectional)Patch 4×4644827.73%26.41%2.3M
GRU (Bidirectional)Row-wise329636.57%35.68%1.8M
GRU (Bidirectional)Patch 4×4644835.64%34.99%1.7M