卷积神经网络-转置卷积

一、简介

我们把从低分辨率特征图(小尺寸)到高分辨率特征图(大尺寸)称为上采样,上采样有两种方式:各种插值方法、转置卷积(反卷积)。

二、转置卷积

转置卷积(Transposed Convolution)又称为反卷积(Deconvolution)。在PyTorch中可以使用torch.nn.ConvTranspose2d()来调用,在Caffe中也有对应的层deconv_layer。
转置卷积常常用于CNN中对特征图进行上采样,比如语义分割和超分辨率任务中。之所以叫转置卷积是因为,它其实是把我们平时所用普通卷积操作中的卷积核做一个转置,然后把普通卷积的输出作为转置卷积的输入,而转置卷积的输出,就是普通卷积的输入。这样说可能有点绕,我们可以参照CNN中的反向传播过程来理解,转置卷积形式上就和一个卷积层的反向梯度计算相同。既然是输入输出对调,那么就有两个很重要的特性:
1、转置的卷积核变为了普通卷积核的转置;
2、如果把由输入特征图到输出特征图的计算过程画成一个计算图,那么输入输出元素的连接关系是不变的

转置卷积的矩阵乘法:
卷积神经网络-转置卷积_第1张图片
我们将上面的416矩阵转置后与拉平的输入41矩阵相乘就可以得到输出的161矩阵。
大家注意看转置卷积示意图和转置卷积的矩阵乘法中对应关系,转置卷积示意图灰色区域表示0-padding。比如在转置卷积示意图中a11只与y11相关(去掉0项),在矩阵乘法中a11也只与y11相关(去掉0项)。同理类推其他项也符合,虽然转置卷积示意图中每个输出由9个乘加得到,转置卷积的矩阵乘法每个输出由4个乘加得到。然后我们将得到的16
1矩阵reshape成4*4矩阵。这里值得注意的是转置矩阵中的权值是由网络学习得到的,而不是直接使用的原来未转置矩阵中的权值。
值得注意的是,在一些深度学习网络的开源框架中并不是通过这种这个转换方法来计算卷积的,因为这个转换会存在很多无用的0乘操作,Caffe中具体实现卷积计算的方法可参考 Implementing convolution as a matrix multiplication。

上面讨论的是没有padding(尽管上面的转置卷积有补0,但这种情况称为’valid’),卷积步长等于1的情况。那么有padding,卷积步长大于1又怎么计算呢?例如下图的两种输入尺寸的正常卷积后输出尺寸都为33,那么33的输入特征图,padding为1,以步长为2的转置卷积后输出尺寸到底是55还是66呢。
首先看看步长大于1的情况怎么做,转置卷积时候也被叫做小数步长的卷积。对于步长s>1的卷积,其对应的转置卷积步长s′<1。步长大于1卷积对应的转置卷积在计算时,在其输入特征单元之间插入strider-1个0,插入0后把其看出是新的特征输入,然后此时步长s′ 不再是小数而是为1,后面转置卷积按步长为1处理即可。

对于转置卷积输出尺寸不确定问题,我们用output_padding参数来控制。
padding就是对输入特征图常规意义的padding,例如’same’模式常取(K-1)/2,output_padding是转置卷积完成后在输出特征图上增加的padding,已达到控制输出特征图形状的目的。一般情况下output_padding=strider-1。转置卷积输入特征图和输出特征图尺寸大小关系为:

在这里插入图片描述

三、总结

本期关于卷及神经网络相关的内容分享就到这里了,这块有大量的概念性的东西和算法,欢迎大家留言交流,共同进步。

你可能感兴趣的:(sdk)