卷积层梯度反向传播,反卷积,上采样以及反池化

1 卷积层梯度反向传播

卷积的前向传播,相对简单 O u p u t = ( I n p u t + 2 p − k ) / s + 1 Ouput = (Input +2p- k)/s + 1 Ouput=(Input+2pk)/s+1,具体实现,可以参考https://zhuanlan.zhihu.com/p/40951745
卷积运算也是转化成矩阵的乘法,如下图
在这里插入图片描述
上图是个多通道的算例,这里就是先运用img2col(image to column),将图片转化成矩阵,然后kernel reshape成一个矩阵,相乘得到output,然后在reshape成图片的形状。下面是个简单的单通道示例在这里插入图片描述
,这里计算梯度反向传播,发现对于YC和WC的梯度都很好计算,而计算XC的梯度相对麻烦在这里插入图片描述
在这里插入图片描述
然后进行最终转化发现,计算X的梯度也是一个卷积运算,就是相当于对Y进行卷积,这个也被称为是反卷积在这里插入图片描述
具体的计算过程在这里插入图片描述
(2) 对于K就是原始K的转置矩阵(就是类似卷积前向是 ( 1 X 9 ) ∗ ( 9 X 3 ) = ( 1 X 3 ) (1X9)* (9X3) = (1X3) 1X9(9X3)=(1X3),然 后进行逆运算 ( 1 X 3 ) ∗ ( 3 X 9 ) = ( 1 X 9 ) (1X3)* (3X9)=(1X9) 1X33X9=1X9
在这里插入图片描述
这个就是整个反向梯度传播的过程,其实也是反卷积的过程。

2 反卷积计算过程

具体可参考(https://zhuanlan.zhihu.com/p/48501100
反卷积的原理如上,实际计算过程,就是给定输入input(3x3),输出(5x5),stride=2,kernel=3*3,反卷积有几种计算方式,其中一种是对input进行插值补0,然后在进行卷积,一般在input之间进行插0的个数是stride-1;按以上的例子就是input插0之后变成5x5输入,然后通过计算padding=1,这里的卷积计算stride好像都是默认为1(这点还有待考究),这样output=(5+2-3)/1+1=5与预期的输出匹配上了;假设输出是6x6,这样就是padding可以设为2,然后输出是7x7,然后在裁剪成6x6(但是这里好像每个框架实现不太一样,有待考究)。

3 反卷积和上采样,反池化的区别

这三种方法都是扩大feature map的方法,就是对语义分割,GAN中会用到,进行图片的再生成,具体可参考(https://blog.csdn.net/qq_27871973/article/details/82973048
1 这里反卷积可以反向生成对应的大小,但是不能完全生成对应的值,这个也是卷积计算,kernel等都是学习得到的,而且反卷积有个严重的就是棋盘效应(就是对于kernel除以stride不是整数,但是其他就不会),具体可以参考https://distill.pub/2016/deconv-checkerboard/在这里插入图片描述
在这里插入图片描述
2 上采样,一般就是重采样或者线性插值,进行扩大feature,但是这种不能改变channel数量,所以一般后面跟一个卷积;所以一般现在都是用upsampling+卷积这种方式,去替代反卷积

3 反池化,就是假设前向是最大池化,就记住最大池化的位置,反向的时候,那个位置依然保证最大池化的数值,其余的补0;如果是平均池化,在反向的时候就所有的位置都补成相同的值

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页