參考
5.2 填充和步幅
5.2.1 填充
填充(padding)是指在輸入高和寬的兩側填充元素(通常是0元素)。圖5.2里我們在原輸入高和寬的兩側分別添加了值為0的元素,使得輸入高和寬從3變成了5,并導致輸出高和寬由2增加到4。圖5.2中的陰影部分為第一個輸出元素及其計算所使用的輸入和核數組元素: 0 * 0 + 0 * 1 + 0 * 2 + 0 * 3 = 0.
下面的例子里,我們創建一個高和寬為3的二維卷積層,然后設輸入高和寬的填充數分別為1。給定一個高和寬為8的輸入,我們發現輸出的高和寬也是8.
import torch
import torch.nn as nn# 定義一個函數來計算卷積層。它對輸入和輸出做出相應的升維和降維
def comp_conv2d(conv2d, X):# (1, 1)代表批量大小和通道數X = X.view((1, 1) + X.shape) # (8, 8) -> (1, 1, 8, 8) Y = conv2d(X)return Y.view(Y.shape[2:]) # 注意這里是兩側分別填充1行或列,所以在兩側一共填充2行或列
conv2d = nn.Conv2d(in_channels=1, out_channels=1, kernel_size=3, padding = 1)X = torch.rand(8, 8)
comp_conv2d(conv2d, X).shape
當卷積核的寬和高不同時,我們也可以通過設置寬和高上不同的填充數使輸出和輸入具有相同的高和寬。
# 使用高為5、寬為3的卷積核。在高和寬兩側的填充數分別為2和1
conv2d = nn.Conv2d(in_channels= 1, out_channels= 1, kernel_size=(5,3), padding=(2,1))
comp_conv2d(conv2d, X).shape
5.2.2 步幅
# 下面我們讓步幅為2,使輸入的寬高減半
conv2d = nn.Conv2d(1,1, kernel_size= 3, padding=1, stride =2)
comp_conv2d(conv2d, X).shape