Tích chập 2D hiệu năng cao qua thuật toán im2col và phép nhân ma trận GEMM
Viết hàm conv2d_im2col(X: np.ndarray, W: np.ndarray, stride: int = 1, padding: int = 0) -> np.ndarray:
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: 2d arrays, matrix multiplication.
Nội dung đề bài
Mục tiêu kiến thức
- Hiểu thuật toán kinh điển im2col (Image to Columns) biến phép tích chập trượt 2D thành phép nhân ma trận hiệu năng cao (GEMM).
- Xử lý đệm biên (Zero-Padding) và bước nhảy (Stride).
- Loại bỏ các vòng lặp Python chậm chạp, tận dụng tối đa thư viện BLAS thông qua np.dot.
Mô tả bài toán
Viết hàm conv2d_im2col(X: np.ndarray, W: np.ndarray, stride: int = 1, padding: int = 0) -> np.ndarray:
- X: Ma trận ảnh đầu vào kích thước (H, Win).
- W: Ma trận bộ lọc (Kernel) kích thước (Kh, Kw).
- Ràng buộc tham số:
- stride >= 1, padding >= 0. Nếu vi phạm, raise ValueError("Tham so stride hoac padding khong hop le").
- Nếu Kh > H + 2 × padding hoặc Kw > Win + 2 × padding, raise ValueError("Kich thuoc kernel vuot qua anh").
- Các bước thực hiện:
- Nếu padding > 0, áp dụng zero-padding xung quanh X: X_pad = np.pad(X, padding, mode='constant', constant_values=0).
- Tính kích thước ma trận đầu ra:
Hout = ⌊ H + 2P - KhS ⌋ + 1 Wout = ⌊ Win + 2P - KwS ⌋ + 1
- Trích xuất các vùng con (patches) kích thước (Kh, Kw) theo bước nhảy S, duỗi mỗi patch thành 1 vector hàng độ dài Kh × Kw, ghép lại thành ma trận Xcol kích thước (Hout × Wout, Kh × Kw).
- Duỗi bộ lọc W thành vector cột W_col = W.reshape(-1, 1).
- Thực hiện nhân ma trận: out_col = np.dot(X_col, W_col).
- Reshape kết quả thành (Hout, Wout).
Input
- Tham số: X: np.ndarray, W: np.ndarray, stride: int, padding: int.
Output
- Trả về: np.ndarray 2D kích thước (Hout, Wout).
Ràng buộc
- Thời gian chạy tối đa: 1500ms.
- Giới hạn bộ nhớ: 512MB.
- Dữ liệu đầu vào tuân thủ đúng kiểu dữ liệu và miền giá trị được mô tả.
Ví dụ 1
Input
conv2d_im2col(X=[[1, 2, 3], [4, 5, 6], [7, 8, 9]], W=[[1, 0], [0, 1]], stride=1, padding=0)
Output
[[6, 8], [12, 14]]
Giải thích
Hàm được gọi với các tham số mẫu trên và trả về kết quả chính xác theo yêu cầu.
Ví dụ 2
Input
conv2d_im2col(X=[[1, 2], [3, 4]], W=[[1, 1], [1, 1]], stride=1, padding=1)
Output
[3, 3]
Giải thích
Hàm được gọi với bộ tham số thứ hai và trả về kết quả tương ứng theo 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.
