1、转置卷积 又可以称为 反卷积(数据从低维到高维)
转置卷积是一个将低维特征转换到高维特征。为什么叫做转置卷积呢?其实就是引入了转置的思想。
- 假设我们现在有一个p维的向量Z,然后有个d维的向量X,p<d.
- 这样就会出现 Z = W·X,其中W的维度为(p,d),叫做转换矩阵.
- 现在,我们要从Z通过相似的方法来得到X,这样我们不难想到:
X= W.T · X
其中W.T的维度是(d,p),但是这两个W并不是同一个值,而是具有转置的形式而已。
上面的例子是一维向量的情况,在卷积操作中,也可以借用这个思想,从低维到高维的转变可以在形式上看成是转置操作。
- 比如我们现在对一个4 * 4的输入做3 * 3的卷积操作(m=3核的大小,stride=1,padding=0),得到一个2 * 2的特征映射
- 如果我们想对这个2 * 2特征映射进行3 * 3卷积,并反过来得到4 * 4的输出,就可以用到转置卷积:
如上图所示,对2 * 2的特征映射先做(m-1)
padding
得到6 * 6的输入,然后对其进行3*3的卷积操作,从而得到4 * 4的特征映射。 同样,这个两个3 * 3的卷积参数不是一致的,都是可学习的。
2、微步卷积(步长不为1的转置卷积(反卷积))
微步卷积其实是一个转置卷积的一个特殊情况,就是卷积操作的stride ≠ 1
。因为在现实中,为了大幅度降低特征维数,卷积的步长会大于1。同样,为了大幅度提高特征维度,我们也可以用通过卷积来实现,这种卷积stride < 1
,所以叫做微步卷积。
- 如果卷积操作stride>1,其对应的转置卷积步长为1/s :就是在输入特征之间插入s – 1个0,来使得步长变’小’。
- 例如,我对一个5 * 5的输入做3 * 3的卷积操作(m=3, padding=0,但是
stride=2
),从而我得到的特征输出为2 * 2. - 现在对其进行微步卷积:
跟转置卷积一样,先对2 * 2的输入做(m-1)padding
,然后再在特征之间插入stride -1
个0,从而得到一个7 * 7的特征输入,然后对其做3 * 3 的卷积操作,得到5 * 5的特征输出。
如何计算反卷积:
当输入的矩阵高宽为n,核大小为k,padding为p,stride为s
- 当输入的矩阵高宽为 n ,核大小为 k ,padding为 p , stride为 s 。
- 转置卷积作用后的尺寸变化: \(n^{1}=s n+k-2 p-s\) 。如果想让高宽成倍增加,那么 \(k=2 p+s\) 。
- 卷积作用后的尺寸变化: \(n^{1}=\left\lfloor\frac{n-k+2 p+s}{s}\right\rfloor\) 。如果想让高宽成倍减少,那么 \(k=2 p+1\)。
1、当填充为0步长为1时
将输入填充 k − 1 。(k是 卷积核大小)
将核矩阵上下,左右翻转。
之后正常做填充为0(无填充),步幅为1的卷积。
2 当填充为 p 步幅为1时
将输入填充 k − p − 1 。
将核矩阵上下,左右翻转。
之后正常做填充为0,步幅为1的卷积。
3 当填充为 p pp 步幅为s ss时
在行和列之间插入s − 1 行和列。
将输入填充 k − p − 1。
将核矩阵上下,左右翻转。
之后正常做填充为0,步幅为1的卷积。
3、空洞卷积(膨胀卷积)
通常来说,对于一个卷积层,如果希望增加输出单元的感受野,一般由三个方式:
- 增加卷积核大小
- 增加层数
- 进行pooling操作
其中1和2都会增加参数量,而3会丢失特征信息。这样我们就可以引入‘空洞卷积’的概念,它不增加参数量,同时它也可以增加输出的感受野。
它主要是通过给卷积核插入空洞来增加其感受野大小,如果卷积核每两个元素之间插入d-1个空洞,那么卷积核的有效大小为:M = m + (m-1)*(d-1)