Xây dựng và Huấn luyện Mạng Tích chập CNN Hoàn chỉnh (PyTorch CPU)
Xây dựng lớp CompactCNN(torch.nn.Module) và hai hàm train_one_epoch, evaluate_model.
Tiến độ của tôi ở bài này
Điểm và code bạn nộp được lưu vào tài khoản sau khi chấm bài.
Đang tải điểm của bạn…
Kiến thức và chủ đề
Kiến thức tiên quyết: pytorch-dataset-dataloader-pipeline.
Nội dung đề bài
Mục tiêu kiến thức
- Xây dựng kiến trúc mạng CNN phân loại ảnh thu gọn:
- Conv2d(1, 8, kernel_size=3, padding=1) -> ReLU -> MaxPool2d(2) (từ 28 × 28 thành 14 × 14).
- Conv2d(8, 16, kernel_size=3, padding=1) -> ReLU -> AdaptiveAvgPool2d((4, 4)) (thành 16 × 4 × 4).
- Flatten() -> Linear(16 * 4 * 4, 32) -> ReLU -> Linear(32, num_classes).
- Cài đặt đầy đủ 2 hàm huấn luyện và đánh giá:
- train_one_epoch(model, dataloader, optimizer, criterion) -> dict[str, float]:
- Phải gọi model.train().
- Phải gọi optimizer.zero_grad(), loss.backward(), optimizer.step().
- Trả về {"loss": float, "accuracy": float} trung bình của epoch.
- evaluate_model(model, dataloader, criterion) -> dict[str, float]:
- Phải chuyển sang model.eval() và dùng ngữ cảnh with torch.no_grad():.
- Trả về {"loss": float, "accuracy": float} trên tập kiểm thử.
Yêu cầu
Xây dựng lớp CompactCNN(torch.nn.Module) và hai hàm train_one_epoch, evaluate_model.
Input
- Hàm train_one_epoch(model, dataloader, optimizer, criterion): Các tham số đầu vào chứa dữ liệu Tensor/mảng NumPy hoặc giá trị siêu tham số tương ứng.
- Hàm evaluate_model(model, dataloader, criterion): Các tham số đầu vào chứa dữ liệu Tensor/mảng NumPy hoặc giá trị siêu tham số tương ứng.
Output
- Hàm train_one_epoch: Trả về kết quả kiểu dict[str, float] theo đúng đặc tả kỹ thuật và kích thước quy định.
- Hàm evaluate_model: Trả về kết quả kiểu dict[str, float] theo đúng đặc tả kỹ thuật và kích thước quy định.
Ràng buộc
- Thời gian chạy tối đa: 4000ms.
- Giới hạn bộ nhớ: 512MB.
- Dữ liệu đầu vào hợp lệ theo đúng kiểu dữ liệu và miền giá trị được mô tả.
Ví dụ 1
Input
torch.manual_seed(42)
X = torch.randn(8, 1, 28, 28)
y = torch.tensor([0, 1, 0, 1, 0, 1, 0, 1], dtype=torch.long)
ds = TensorDataset(X, y)
loader = DataLoader(ds, batch_size=4, shuffle=False)
model = CompactCNN(num_classes=2)
optimizer = torch.optim.Adam(model.parameters(), lr=0.01)
criterion = nn.CrossEntropyLoss()
res1 = train_one_epoch(model, loader, optimizer, criterion)
res2 = train_one_epoch(model, loader, optimizer, criterion)
Output
{
'loss': 0.673357,
'accuracy': 0.75
}
Giải thích
Hàm/lớp được gọi với các tham số mẫu trên và trả về kết quả số học / kích thước tensor tương ứng theo đúng thiết kế.
Ví dụ 2
Input
X = torch.randn(4, 1, 28, 28)
y = torch.tensor([0, 1, 0, 1], dtype=torch.long)
loader = DataLoader(TensorDataset(X, y), batch_size=4)
model = CompactCNN(num_classes=2)
criterion = nn.CrossEntropyLoss()
eval_res = evaluate_model(model, loader, criterion)
Output
{
'loss': 0.698042,
'accuracy': 0.5
}
Giải thích
Hàm/lớp được gọi với các tham số mẫu trên và trả về kết quả số học / kích thước tensor tương ứng theo đúng thiết kế.
Gợi ý và lời giải chỉ mở sau khi bạn bấm Nộp bài. Giáo viên và quản trị viên mở được ngay.
Góp ý & báo lỗi bài tập
Đề bài chưa rõ, test có vấn đề hay bạn có ý tưởng giúp bài tốt hơn? Gửi cho đội ngũ AI Empire nhé — mỗi góp ý đều được đọc.
