P20 卷积层里的填充和步幅

这次的重点就是公式

 

#在所有侧边填充1个像素

import torch
from torch import nn
#目前的输入是一个矩阵,不考虑通道和batch size
def comp_conv2d(conv2d,X):
    X = X.reshape((1,1) + X.shape)
    #(1,1)分别代表纬度数=1 和batch size =1
    Y = conv2d(X)
    return Y.reshape(Y.shape[2:])
#返回的是一个四维的东西,我们拿掉前面两维,得到一个矩阵的输出,这样方便的看我们怎样减少或者增加输出

conv2d = nn.Conv2d(1,1, kernel_size=3, padding=1)
#这里的1,1是输入和输出的通道数都是1;padding=1是上下左右各填充一行
X = torch.rand(size=(8,8))
#随机生成一个8*8的矩阵放入函数
print(comp_conv2d(conv2d,X).shape)

#torch.Size([8, 8]) 得到一个8*8的输出
#因为输入是8*8,kernel大小是3*3,上下左右都填充1说明填充是高宽是2*2,这样输出和输入不会有变化
#公式:

8-3+2+1 = 8

8-3+2+1 = 8

#填充不同的高度和宽度
conv2d = nn.Conv2d(1,1, kernel_size=(5,3),padding=(2,1))
#padding = 2,1 的意思是上下填充的数量分别是2,左右填充的数量分别是1,所以填充的高度ph是2*2=4,填充的宽度pw是1*2=2
print(comp_conv2d(conv2d,X).shape)
#torch.Size([8, 8])
#(8-5+4+1)/1 = 8
#(8-3+2+1)/1 = 8

conv2d = nn.Conv2d(1,1, kernel_size=(5,3),padding=(2,1),stride=2)
print(comp_conv2d(conv2d,X).shape)
#torch.Size([4, 4])
#(8-5+4+2)/2 = 9/2 = 4 向下取整,以下雷同
#(8-3+2+2)/2 = 9/2 = 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])
#(8-3+0+3)/3 = 8/3 = 2
#(8-5+2+4)/4 = 9/4 = 2


 

你可能感兴趣的:(李沐机器学习,深度学习,pytorch)