卷积
卷积是特征提取的常用操作,卷积可以改变图片的通道和大小,相比全连接操作,卷积可以减少计算量,并且充分融合图像的局部特征。
import torch
import torch.nn as nn
x = torch.randn(1,1,4,4)
model = nn.Conv2d(in_channels=1,out_channels=1,kernel_size=3,stride=1,padding=0)
output = model(x)
print('output shape',output.shape)
import torch
import torch.nn as nn
x = torch.randn(1,1,5,5)
model = nn.Conv2d(in_channels=1,out_channels=1,kernel_size=4,stride=1,padding=2)
output = model(x)
print('output shape',output.shape)
反卷积(ConvTranspose2d)
反卷积是深度学习常见的上采样操作。另外上采样还有uppooling和双三次插值。
反卷积可以认为先对feature map进行插值/padding操作得到新的feature map然后进行常规的卷积运算
反卷积并不是卷积操作的逆过程。通过反卷积,只能恢复原矩阵的大小,但并不能完全恢复原矩阵的数值。
反卷积的参数与卷积的参数含义发生的变化。pandding可以理解为卷积核向中心移动的步数。 同时stride也不再是kernel移动的步数,变为输入单元彼此散开的步数。
反卷积的padding参数
padding=0,kernel_size=3,stride=1
padding=2,kernel_size=3,stride=1
可以看到当padding=2的时候这个kernel向中心平移了2个单位。
反卷积的stride参数
padding=0,kernel_size=3,stride=1
padding=0,kernel_size=3,stride=2
可以看到stride等于在原始图片中填充0,填充的格式为stride-1
反卷积中output_padding参数
当stride>1的时候,在特征图的下方和右方进行插值。
import torch
import torch.nn as nn
x = torch.randn(1,1,3,3)
#这里的padding 与卷积的padding相反,卷积中的padding是在周围填充0,而这里的padding是已经在周围插值的kernel_size个0,padding表示的向中心移动的距离
#output_padding,表示当stride大于1的时候,需要在特征图周围进行填充
model = nn.ConvTranspose2d(in_channels=1,out_channels=1,kernel_size=3,stride=2,padding=1,output_padding=1)
output = model(x)
print('output shape',output.shape)