卷积层
卷积神经网络是在BP神经网络的改进,与BP类似,都采用了前向传播计算输出值,反向传播调整权重和偏置;CNN与标准的BP最大的不同是:CNN中相邻层之间的神经单元并不是全连接,而是部分连接,也就是某个神经单元的感知区域来自于上层的部分神经单元,而不是像BP那样与所有的神经单元相连接。CNN的有三个重要的思想架构:
- 局部区域感知
- 权重共享
- 空间或时间上的采样
公式参考《Notes on Convolutional Neural Networks》。
1.卷积层前向计算
上面的*号实质是让卷积核k在第l-1层所有关联的feature maps上做卷积运算,然后求和,再加上一个偏置参数,取sigmoid得到最终激励值的过程。
假设第l-1层只有两个feature map,大小为4*4像素,一个卷积核K(二维卷积核K11和K12),大小为2*2,则计算第l层的一个feature map结果如下,大小为3*3像素。
(在计算前要把卷积核旋转180°)第一步在python中的代码实现如下。
def conv(self,a, v, full=0): # valid:0 full:1 ah, aw = np.shape(a) vh, vw = np.shape(v) if full: temp = np.zeros((ah + 2 * vh - 2, aw + 2 * vw - 2)) temp[vh - 1:vh - 1 + ah, vw - 1:vw - 1 + aw] = a a = temp ah, aw = np.shape(a) k = [[np.sum(np.multiply(a[i:i+vh,j:j+vw],v)) for j in range(aw - vw + 1)] for i in range(ah - vh + 1)] return k
2.卷积层的残差计算
其中第l层为卷积层,第l+1层为subsampling层,subsampling层与卷积层是一一对应的。其中up(x)是将第l+1层的大小扩展为和第l层大小一样。
○指点乘,对应numpy.multiply。
假如第l+1层为2*2的,subsampling的采样大小为2*2,其中第l+1层的一个feature map所对应的残差为:
那么扩展之后就变为了
实现代码如下。
def up(self,a,n): b=np.ones((n,n)) return np.kron(a,b)
3.卷积层的梯度计算
如卷积层为3*3的大小,卷积核的大小为2*2上一层feature map大小为4*4。
实际等于convolve2d(xl-1,delta)。
4.subsampling层前向计算
这里的down(x)是将x中采样大小中像素值进行采样操作,如求和、最大值。
5.subsampling层残差计算(假设下一层为卷积层)
对于下图中第l-1层值为6的元素,根据卷积层前向计算的过程,与第l层的关联运算如下。
故根据bp算法中残差计算方法等于第l层与其连接的所有结点的权值和残差的加权和再乘以该点对z的导数值,相当于用旋转180度的卷积核直接在下一层卷积层的残差上做卷积运算,方式为full类型。
6.subsampling层梯度计算(假设下一层为卷积层)