学习视频引用链接:
https://www.bilibili.com/video/BV1644y1h7LN?spm_id_from=333.788.videopod.sections&vd_source=b86a47770473ecf0ae09ca5dbf102246
卷积
卷积一般用于局部建模/下采样,用于分类多一些,而转置卷积则用于上采样中,用于低分辨率→高分辨率的生成模型中。
Pytorch中两种实现卷积的API
通过Conv2d实现卷积的操作:nn.Conv2d 是Class,需要首先进行实例化,而F.Conv2d是函数Function,因此不需要进行实例化。(可以理解为nn.Conved是2D卷积层,而F.conv2d是2D卷积操作。)
input_size = [ batch_size代表样本的数目,in_channels输入图片通道数(RGB就是3个通道数),图片高度(矩阵行数),图片宽度(矩阵列数)]
conv_layer.weight就是kernel。
Python具体实现卷积的算法(不调用API)
原始矩阵运算实现二维卷积(不考虑batchsize、channel维度)
添加padding操作
F.pad(input, (左边几列,右边几列,上方几行,下方几行))
添加bias
bias的维度与输入通道数保持一致
验证成功,矩阵乘法实现的卷积跟PyTorchAPI的结果一致
input flatten版本
numel返回张量元素的总数
a.reshape(-1, 1)变成一个列向量,-1表示剩下的所有维度,1表示第二个维度的大小
上述代码报错因为i,j不是连续变化的,更改后正确如下
原始矩阵运算实现二维卷积(考虑batchsize、channel维度)
F.pad(input, (左边几列,右边几列,上方几行,下方几行,channel padding×2,batch_size padding×2))
input变成四维张量(batch_size,输入通道数,图片高度,图片宽度)
kernel变成四维张量(输出通道数,输入通道数,kernel高度,kernel宽度)
output的维度与输出通道数个数一致,每个output的维度都是逐个输入通道相加得到的结果,因此先循环输入通道,后循环输出通道。最后再对样本层进行遍历,因为对每个样本都需要做卷积。
输入、输出通道维数不为1的话,循环顺序如下:
样本数:
输出通道数:
输入通道数:
卷积输出的高度:
卷积输出的宽度:
kernel flatten版本
转置卷积
原始输出mm_conv2d_output是2×2的,而mm_transposed_conv2d_output是4×4的,通过转置卷积可以实现上采样。
空洞卷积与群卷积
dilation控制取的输入特征图部分是否为紧凑的,若dilation>1则不是紧凑取,中间有跳过的 dilation-1 个元素。 增大dilation不会增大计算量,因此可以通过增大dilation来扩大感受野的面积。
当groups=2时,导致总卷积核数目变为原来所需卷积核的1/2 ,即输入与输出之间不是“全连接”。
注意:上述自定义函数中kernel.shape不能写in_channel//groups,否则会报错。应该改为:out_channel, _, kernel_h, kernel_w = kernel.shape才不会报错。