Các ops gộp và tích chập trượt một "cửa sổ" trên tenxơ đầu vào. Sử dụng tf.nn.conv2d
làm ví dụ: Nếu tenxơ đầu vào có 4 kích thước: [batch, height, width, channels]
thì tích chập hoạt động trên cửa sổ 2D trên các height, width
kích thước.
strides
xác định mức độ thay đổi của cửa sổ trong mỗi kích thước. Việc sử dụng thông thường đặt bước đầu tiên (đợt) và lần cuối (độ sâu) thành 1.
Chúng ta hãy sử dụng một ví dụ rất cụ thể: Chạy tích chập 2 chiều trên hình ảnh đầu vào thang độ 32x32. Tôi nói thang độ xám vì sau đó hình ảnh đầu vào có độ sâu = 1, giúp giữ cho nó đơn giản. Hãy để hình ảnh đó trông như thế này:
00 01 02 03 04 ...
10 11 12 13 14 ...
20 21 22 23 24 ...
30 31 32 33 34 ...
...
Chúng ta hãy chạy một cửa sổ tích chập 2x2 qua một ví dụ duy nhất (kích thước lô = 1). Chúng tôi sẽ cung cấp cho tích chập độ sâu kênh đầu ra là 8.
Các đầu vào để tích chập có shape=[1, 32, 32, 1]
.
Nếu bạn chỉ định strides=[1,1,1,1]
với padding=SAME
, thì đầu ra của bộ lọc sẽ là [1, 32, 32, 8].
Bộ lọc trước tiên sẽ tạo đầu ra cho:
F(00 01
10 11)
Và sau đó cho:
F(01 02
11 12)
và như thế. Sau đó, nó sẽ di chuyển đến hàng thứ hai, tính toán:
F(10, 11
20, 21)
sau đó
F(11, 12
21, 22)
Nếu bạn chỉ định một sải chân của [1, 2, 2, 1] thì nó sẽ không làm các cửa sổ chồng chéo. Nó sẽ tính toán:
F(00, 01
10, 11)
và sau đó
F(02, 03
12, 13)
Các bước hoạt động tương tự cho các nhà khai thác gộp.
Câu 2: Tại sao sải bước [1, x, y, 1] cho convnets
1 đầu tiên là lô: Bạn thường không muốn bỏ qua các ví dụ trong lô của mình hoặc bạn không nên đưa chúng vào vị trí đầu tiên. :)
1 cuối cùng là độ sâu của tích chập: Bạn thường không muốn bỏ qua các đầu vào, vì lý do tương tự.
Toán tử conv2d tổng quát hơn, do đó bạn có thể tạo các kết cấu trượt cửa sổ dọc theo các kích thước khác, nhưng đó không phải là cách sử dụng thông thường trong convnets. Việc sử dụng điển hình là sử dụng chúng theo không gian.
Tại sao định hình lại thành -1 -1 là một trình giữ chỗ cho biết "điều chỉnh khi cần thiết để phù hợp với kích thước cần thiết cho thang đo đầy đủ". Đó là một cách làm cho mã độc lập với kích thước lô đầu vào, để bạn có thể thay đổi đường ống của mình và không phải điều chỉnh kích thước lô ở mọi nơi trong mã.