本文主要是介绍卷积层梯度反向传播,反卷积,上采样以及反池化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1 卷积层梯度反向传播
卷积的前向传播,相对简单 O u p u t = ( I n p u t + 2 p − k ) / s + 1 Ouput = (Input +2p- k)/s + 1 Ouput=(Input+2p−k)/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) (1X3)∗(3X9)=(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;如果是平均池化,在反向的时候就所有的位置都补成相同的值
这篇关于卷积层梯度反向传播,反卷积,上采样以及反池化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!