python-090Đọc toàn bộ đề miễn phí

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:

PythonNâng cao35 phút

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ủ đề

cnnconvolutionim2colgemmnumpy

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 X_col 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ế.

3 cấp độ gợi ýMở dần khi bạn thật sự cần hỗ trợ.
Phân tích lời giảiGiải thích hướng tư duy và thuật toán.
Code tham khảoDùng để đối chiếu sau khi tự làm.

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.