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 đượ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, raiseValueError("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
X_colkí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.ndarray2D 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.
