20填充與步幅
import torch
from torch import nn# 此函數初始化卷積層權重,并對輸入和輸出提高和縮減相應的維數
def comp_conv2d(conv2d, X):# 這里的(1,1)表示批量大小和通道數都是1#將輸入張量 X 的形狀調整為 (1, 1, height, width)X = X.reshape((1,1) + X.shape)Y = conv2d(X) #張量X為 8 * 8,經過conv2d,填充為1,變為10 * 10#卷積核為3 * 3, 得到Y為 8 * 8return Y.reshape(Y.shape[2:])#將輸出張量 Y 的形狀從 (1, 1, new_height, new_width) #變換為 (new_height, new_width),去掉批量大小和通道數的維度。# 請注意,這里每邊都填充了1行或1列,因此總共添加了2行或2列
conv2d = nn.Conv2d(1, 1, kernel_size=3, padding=1)
X = torch.rand(size=(8, 8))
print(comp_conv2d(conv2d, X).shape)
# torch.Size([8, 8])# 步幅
# 高度和寬度的步幅設置為2,從而將輸入的高度和寬度減半
conv2d = nn.Conv2d(1, 1, kernel_size=3, padding=1, stride=2)
print(comp_conv2d(conv2d, X).shape)
# torch.Size([4, 4])conv2d = nn.Conv2d(1, 1, kernel_size=(3, 5), padding=(0, 1), stride=(3, 4))
print(comp_conv2d(conv2d, X).shape)
# torch.Size([2, 2])