原文地址:https://www.cnblogs.com/zf-blog/p/8638664.html
参考链接:https://www.zybuluo.com/hanbingtao/note/485480
https://github.com/hanbt/learn_dl/blob/master/cnn.py
一、卷积层
(1)首先是卷积神经网络中的卷积操作:
计算公式为:
注意上式的使用场景:stride = 1 , channel = 1
我们可以将其扩展到 stride = s , channel = d时的情况,这个时候公式如下:
(2)然后,我们再来看一下数学中的卷积操作,下面引入数学中的二维卷积公式:
对于如下的图,数学中的卷积操作如下:
从上图可以看到,A左上角的值与B对应区块中右下角的值相乘,而不是与左上角的相乘。因此,数学中的卷积和卷积神经网络中的『卷积』还是有区别的,为了避免混淆,我们把卷积神经网络中的『卷积』操作叫做互相关(cross-correlation)操作。
另外:数学卷积和互相关操作是可以相互转化的,比如对于C = A * B,这里A和B的卷积就相当于将B翻转180度然后与A做互相关操作得到。
(3)再来说说卷积层的前向、反向传播:
首先是前向传播:很简单,直接使用互相关的公式计算即可;
然后是反向传播:可以参考我之前作的关于全连接层的反向传播过程,原理公式近似;
具体说一下反向传播过程:
首先引入一道题:
首先说一下前提:
另外:是加权后的输出,但没有经过激活函数;
可以发现,卷积层的反向传播过程和全连接层的反向传播过程真的是神似啊,只不过公式需要对应的修改一下;
这里还要注意一点的是,步长stride = s和stride = 1时反向传播的区别:
这里面就涉及到了“扩展”和"zero padding"操作,在后面代码中有所体现;
紧接着我们可以得到权重梯度和偏置项梯度如下: