语义分割|学习记录(2)转置卷积
提示:来自up主霹雳吧啦Wz,我只是做一下学习笔记,原视频
文章目录
前言
后面的很多网络需要用到转置卷积,所以先介绍一下转置卷积的相关概念
转置卷积部分主要介绍的内容:
- 什么是转置卷积
- 转置卷积操作步骤
- 转置卷积常见参数
- 转置卷积实例
一、什么是转置卷积?
转置卷积(Transposed Convolution),它主要起到一个上采样
的作用。
我们首先看左边的普通卷积
,padding = 0,strides=1(conv)
,实现的效果就是通过一个3 * 3的卷积核,一张5 * 5 的图片变成了一张2*2的图片。
我们再来看右边的转置卷积,padding = 0,strides=1(transposed conv)
,注意⚠️ 这里面的padding指的是上采样之后对应的图对比原图是否扩充了
!这里面将特征层的大小还原回了卷积之前的大小。
强调一点:转置卷积并不是卷积的逆运算
!大小还原回去了,但是数值和之前的数值已经不相同了
!
A guide to convolution arithmetic for deep learning
二、转置卷积的运算步骤
- 在输入特征图元素间填充s-1行、列0(s指的是特征图中间填充0 的行数或者列数)
- 在输入特征图四周填充k-p-1行、列0
- 将卷积核参数上下、左右翻转
- 做正常卷积运算(填充0,步距1)
No padding, no strides, transposed:s=1,p=0,k=3
No padding, strides, transposed:s=2,p=0,k=3
Padding, strides, transposed:s=2,p=1,k=3
输出图片的宽和高的计算公式如下:以Padding, strides, transposed:s=2,p=1,k=3举例说明。
三、转置卷积的实例
- 我们进行完输入特征图元素间填充和输入特征图四周填充后得到最左边的这样一张feature map作为下一步的输入(忽略偏执bias)
- 下一步我们将卷积核参数上下、左右翻转
- 然后再进行普通卷积的操作
到此为止,我们就完成了转置卷积的操作
但为什么要这样做呢?后面进行进一步解释。
PyTorch官方关于转置卷积相关参数的情况如下:
四、对转置卷积再进行一个深入的探究实例
首先看一下普通的卷积运算,这里不做过多赘述。
上面的卷积的形式是我们常常看见的,但是真正计算机在运算时候并不是一个窗口一个窗口的滑动,这样做的缺点在于太过于低效!
而是采取下面这种卷积kernel等效矩阵:
- 当卷积核位于左上角的时候,那么就构建出如红色矩阵这样一个形式
- 同理,滑动到那个位置,就构建出相应填充0 的矩阵
- 然后将输入特征图和卷积等效矩阵相成,得到输出特征图
最后的卷积效果和滑动窗口效果是相同的。
我们这时候将输入feature map展平!得到下图I
接下来再将等效kernel卷积核也展平,得到下图C
I和C相乘,得到输出特征图O(这个O也就是输出特征层展平之后的结果)
接下来我们将上述过程反过来思考:我们已知O和C,我们能否反推回来矩阵I呢?答案是不能的,换句话说也就是卷积并不是可逆的
,原因在于:一个矩阵存在逆矩阵的条件是这个矩阵必须是方阵
,这个条件在这里并不满足。
虽然不能反推回I,但是我们可以得到一个和原来I大小相同的一个矩阵P。然后经过reshape,我们就得到了一个4*4的和卷积之前大小相同的一个图,这就是前面所说的,转置卷积实际上是一个上采样的过程。
这里我们再换一种形式做这个反推的过程:
我们将O还原会2*2的特征层
再将
C
T
C^T
CT每一列都变成一个2 * 2的等效矩阵,一共16个
O与16个C分解的小矩阵依次相乘
在上面这个过程我们就发现转置卷积的每一个小的白色矩阵和I进行相乘与绿色的卷积核在特征图上滑动的效果是等效的。这个绿色的卷积和也就是卷积核Kernel的上下左右翻转,这就是转置卷积的计算原理。
到这里相信大家对于转置卷积的理解更加深刻了吧!