目录
转置卷积(Transposed Convolution)
作用
转置卷积的输出
转置卷积过程
转置卷积运算过程
pytorch中转置卷积对应参数
膨胀卷积(空洞卷积,Atrous convolution)
作用
gridding effect问题
膨胀系数设置
上采样(upsample)
下图左侧为传统的卷积,输入为4x4的特征图,卷积核大小为3x3,padding为0,stride为1,卷积后输出2x2的特征图。
右侧为转置卷积,输入为2x2的特征图,卷积核大小为3x3,padding为0,stride为1,卷积后输出4x4的特征图。
注意:
转置卷积的输出特征图的高度和宽度卷积公式
如下面的转置卷积所示,输入高度和宽度为3,stride为2,padding为1,卷积核尺寸为3x3,所以卷积后输出的特征图尺寸为5x5.
转置卷积的步骤:
输入为2x2的特征图,首先将输入特征图进行0填充得到6x6的特征图,将卷积核进行上下和左右翻转得到转置卷积核,然后进行卷积操作输出4x4的特征图。
我们都知道普通卷积的计算过程都是以滑动窗口的形式进行卷积计算的,即卷积核在特征图上进行滑动卷积,但是实际中的操作并不是这样的,因为这样的计算效率很低。
实际的卷积计算过程是首先将卷积核转化成一个个等效矩阵,等效矩阵的构建时在卷积核中填充0,构建和输入相同大小的等效矩阵,如下图,将每个等效矩阵和输入特征图相乘再相加,得到输出特征图。
将输入展平成1*16的矩阵
同理将卷积核等效矩阵展成16*4的矩阵
最后将1*16的输入矩阵和16*4的卷积核等效矩阵相乘得到1*4的输出矩阵
上述过程其实就是一个简单的矩阵运算,运算公式为
面对上面卷积运算公式,我们可以思考,卷积的运算是否可逆?即已知O和C是否可以求得I呢?
有的人会觉得可以,在上式的两边同时乘以C的逆矩阵局可以得到I,但是我们要知道,一个矩阵是否可逆的必要条件是这个矩阵是否为方阵,而C并不是一个方阵,所以我们并不能根据C和O来还原I,即卷积的运算是不可逆的。
但是在这里我们可以不要求完全还原成矩阵I,而是还原为和输入矩阵I尺寸相同的矩阵是可以的,将等式两边同时乘以矩阵C的转置矩阵就可以了。
综上,其实就是转置卷积的运算过程
torch.nn.ConvTranspose2d参数:
如图所示为膨胀卷积,膨胀卷积中的间隙为膨胀因子,下图中的膨胀因子为2
在如图左侧为将Layer1进行三次膨胀卷积操作,而右侧图为经过r=2的三次膨胀卷积后,Layer4中使用到了Layer1中的哪些像素,方格中的数字表示使用的次数,通过右侧图可知,其中还有好多像素没有被使用到,这就会导致很多细节特征丢失。
如果将三次膨胀卷积的膨胀因子分别设为r=1、r=2和r=3,则Layer4中使用到的Layer1中的像素如图,可以看到Layer1的像素基本都被用到,感受野是相通的都是13x13,但是中间没有出现0次数的像素。
那如果我们使用普通的卷积时,得到7x7的感受野,相比使用膨胀卷积感受野变小,由此也能说明膨胀卷积具有增大感受野的作用。
两个非零元素之间的距离公式
其中r_i表示第i层膨胀系数,最后一层M_n=r_n。
最好是将膨胀系设置成锯齿状,例如[1,2,3,1,2,3],其次公约数不能大于1