nn.Conv2d与nn.ConvTranspose2d参数理解
文章目录
前言
其实两者在形状上是逆运算,即:大小为 I I I的图像,经过以 k k k卷积核大小, s s s步长, p p p填充大小的Conv2d卷积,变为大小 O O O的输出;那么,大小为 O O O的图像,经过以 k k k卷积核大小, s s s步长, p p p填充大小的ConvTranspose2d的逆卷积之后,则会变为大小 I I I的输出。
# data.shape: batch * c * w * h
cov = torch.nn.Conv2d(c, y, k, s, p)
cov_trans = torch.nn.ConvTranspose2d(y, c, k, s, p)
data1 = cov(data) # data1.shape: batch * y * w1 * h1
data2 = cov_trans(data1) # data2.shape: batch * y * w * h
# 可以看到最后又变成了原来的大小。
1. torch.nn.Conv2d()
torch.nn.Conv2d( in_channels, #输入数据的通道数(如彩色图片,一般为3)
out_channels, #输出数据的通道数(就是我想让输出多少通道,就设置为多少)
kernel_size, #卷积核的尺寸(如(3,2),3与(3,3)等同)
stride = 1, #卷积步长,就是卷积操作时每次移动的格子数
padding = 0, #原图周围需要填充的格子行(列)数,无填充的话卷积到边缘会直接忽略该边缘
dilation = 1, #空洞卷积的空洞指数,一般默认为1即可
groups = 1, #分组卷积的组数,一般默认设置为1,不用管
bias = True, #卷积偏置,一般设置为False,True的话可以增加模型的泛化能力
padding_mode = 'zeros' #设置边缘填充值为0,或别的数,一般都默认设置为0
)
1.1 输入和输出
- 输入图像尺寸: I I I
- 输出图像尺寸: O O O
- 卷积核大小(kernel_size): k k k
- 步长(stride): s s s
- 填充(padding): p p p
1.2 计算公式
- O = ( I − k + 2 p ) / s + 1 O = (I-k+2p) / s + 1 O=(I−k+2p)/s+1
2. torch.nn.ConvTranspose2d()
torch.nn.ConvTranspose2d(in_channels,
out_channels,
kernel_size,
stride=1,
padding=0,
output_padding=0,
groups=1,
bias=True,
dilation=1,
padding_mode='zeros') # by default
2.1 输入和输出
- 输入图像尺寸: I I I
- 输出图像尺寸: O O O
- 卷积核大小(kernel_size): k k k
- 步长(stride): s s s
- 填充(padding): p p p
2.2 计算公式
- O = ( I − 1 ) s + k − 2 p O = (I-1)s + k - 2p O=(I−1)s+k−2p ,刚好是1.2的相反,逆运算。也就是将1.2中的 I I I移到左边,变为 O O O即可。