【一文读懂卷积神经网络(一)】可能是你看过的最全的CNN(步长为1,无填充)

本文深入介绍了卷积神经网络(CNN)的前向传播与反向传播过程,特别是步长为1且无填充的情况。内容涵盖卷积、池化、激活函数ReLU的原理与计算,以及这些层的反向传播,包括最大池化和均值池化的反向传播。通过实例解析了卷积层权重和偏置的更新方法,最后提供了部分Python代码实现。
摘要由CSDN通过智能技术生成

本系列将由浅入深的介绍卷积神经网络的前向传播与后向传播,池化层的前向传播与后向传播,并分别介绍在不同步长与不同填充的情况下卷积层和池化层的前向传播与后向传播又有哪些不同。最后给出完整的Python实现代码。

完整目录如下:

一、CNN ⇒ \Rightarrow 步长为1,无填充的卷积神经网络

二、CNN ⇒ \Rightarrow 步长为1,填充的卷积神经网络

三、CNN ⇒ \Rightarrow 步长为1,无填充的卷积神经网络

四、CNN ⇒ \Rightarrow 步长为1,填充的卷积神经网络

最近在学习卷积神经网络,虽然如今已有tensorflow、caffe、pytorch等框架可供我们使用,非常的方便简单也非常的高效,但本着学习的态度,我决定搞懂CNN的底层原理,前向传播和后向传播是如何进行的,于是开此系列来记录我的学习,与大家一同分享,本人作为小白,难免会有错误的地方,希望大家及时给我指出,共同进步。

本文先介绍无填充,步长为1的卷积神经网络。

1. CNN的前向传播(无填充,步长strides=1)

首先我们先介绍一下卷积和池化。

卷积与池化

1.1 何为卷积?

输入一张5x5的图像矩阵A,给定3x3的卷积核矩阵W,步长为1,无填充,则由A*W可得到一个新的矩阵Z,如下图所示
convolution
Z矩阵里红色框的值由A矩阵红色框里的值与卷积核卷积得出,具体地 97 = 1 × 2 + 2 × 2 + 3 × 3 + 4 × 1 + 5 × 2 + 6 × 1 + 7 × 3 + 8 × 4 + 9 × 1 97=1\times2+2\times2+3\times3+4\times1+5\times2+6\times1+7\times3+8\times4+9\times1 97=1×2+2×2+3×3+4×1+5×2+6×1+7×3+8×4+9×1
若设定步长为1,则会向右移动一个单位的距离,同样,Z矩阵里绿色框的值由A矩阵绿色框里的值与卷积核卷积得出,具体地 103 = 2 × 2 + 3 × 2 + 2 × 3 + 5 × 1 + 6 × 2 + 7 × 1 + 8 × 3 + 9 × 4 + 3 × 1 103=2\times2+3\times2+2\times3+5\times1+6\times2+7\times1+8\times3+9\times4+3\times1 103=2×2+3×2+2×3+5×1+6×2+7×1+8×3+9×4+3×1

1.2 何为池化?

池化层的作用主要为对输入的特征图进行压缩,一方面使特征图变小,简化网络计算复杂度;一方面进行特征压缩,提取主要特征。
池化层需要指定一个核和步长,以及是否填充,我们并不要求核有具体的值,只需要核的大小,步长通常取核的大小。
池化一般采取两种方式,最大池化和均值池化。首先介绍一下最大池化

1.2.1 最大池化

给定了2x2的核,步长为2,无填充,对4x4的输入进行最大池化得到的结果如下图所示。
maxpool
最大池化即是指在池化核的大小里,取最大的那一个值,如对于上图左图左上角红色框里,取值依次为59,103,244,12,其中最大值为244,因此右图红色框里的值为244,因为步长为2,接着向右移动2个单位,来到绿色窗口,依此类推。

1.2.2 均值池化

给定了2x2的核,步长为2,无填充,对4x4的输入进行均值池化得到的结果如下图所示。
meanpool
均值池化是指在池化核的大小里,取所有值得均值,如对于上图左图左上角红色框里,取值依次为59,103,244,12,均值则为(59+103+244+12)/4=104.5,因此右图红色框里的值为104.5,因为步长为2,接着向右移动2个单位,来到绿色窗口,依此类推。

激活函数

激活函数有很多种,如tanh,sigmoid,relu,softmax等,在本例中除最后一层外,激活函数都采用relu,relu会将输入的数当中小于0的变为0,大于0的保存原值不变。

relu

前向传播总流程

一般来说,CNN的前向传播就是由很多个卷积层和池化层及激活函数组成的,这里为了方便,我们假设我们的网络的前向传播为卷积 → \to relu → \to 池化。
1
本例采用5x5的输入,3x3的卷积核,2x2的池化核,步长均为1,且没有填充。图示如下

卷积层:conv_forward
池化层:pool_forward

写成数学表达式为:

Z 1 = A 0 ∗ W 0 + b 0 Z^{1}=A^{0}\ast W^{0}+b^{0} Z1=A0W0+b0 (卷积层)

A i n 1 = r e l u ( Z 1 ) A^{1}_{in}=relu(Z^{1}) Ain1=relu(Z1)(激活层)

A o u t 1 = p o o l ( A i n 1 ) A^{1}_{out}=pool(A^{1}_{in}) Aout1=pool(Ain1)(池化层)

这就是卷积和池化的前向传播。

2. CNN的反向传播(无填充,步长strides=1)

对于上述前向传播,我们将损失定义为loss,我们的目标是去minimize loss,记loss对某个参数x的偏导数为dx,先来看看池化层的反向传播。

2.1 池化层的反向传播

loss对池化层输入 A 1 A^{1} A1的偏导数为 d A i n 1 dA^{1}_{in} dAin1,池化层的反向传播的数学表达式可写为 d A i n 1 = d A o u t 1 × d A o u t 1 d A i n 1 dA^{1}_{in}=dA^{1}_{out}\times \frac{dA^{1}_{out}}{dA^{1}_{in}} dAin1=dAout1×dAin1dAout1,其中最关键的一步是搞清楚 d A o u t 1 d A i n 1 \frac{dA^{1}_{out}}{dA^{1}_{in}} dAin1dAout1怎么求。我们由之前的介绍可知,池化层分为最大池化和均值池化,我们来分别探讨这两种情况。

2.1.1 最大池化的反向传播

如下图所示,给定2x2的池化核,设定步长为1,彩色方框框出的值是每个池化核区域内的最大值。
maxpool_forward
则我们可知

A 11 = 1 × a 11 + 0 × a 12 + 0 × a 21 + 0 × a 22 A11=1\times a11+0\times a12+0\times a21+0\times a22 A11=1×a11+0×a12+0×a21+0×a22

A 12 = 0 × a 12 + 1 × a 13 + 0 × a 22 + 0 × a 23 A12=0\times a12+1\times a13+0\times a22+0\times a23 A12=0×a12+1×a13+0×a22+0×a23

A 21 = 0 × a 21 + 0 × a 22 + 1 × a 31 + 0 × a 32 A21=0\times a21+0\times a22+1\times a31+0\times a32 A21=0×a21+0×a22+1×a31+0×a32

A 22 = 0 × a 22 + 0 × a 23 + 0 × a 32 + 1 × a 33 A22=0\times a22+0\times a23+0\times a32+1\times a33 A22=0×a22+0×a23+0×a32+1×a33

所以可得

d A 11 d a 11 = 1 , d A 11 d a 12 = 0 , d A 11 d a 21 = 0 , d A 11 d a 22 = 0 \frac{dA11}{da11}=1,\frac{dA11}{da12}=0,\frac{dA11}{da21}=0,\frac{dA11}{da22}=0 da11dA11=1,da12dA11=0,da21dA11=0,da22dA11=0

d A 12 d a 12 = 0 , d A 12 d a 13 = 1 , d A 12 d a 22 = 0 , d A 12 d a 23 = 0 \frac{dA12}{da12}=0,\frac{dA12}{da13}=1,\frac{dA12}{da22}=0,\frac{dA12}{da23}=0 da12dA12=0,da13dA12=1,da22dA12=0,da23dA12=0

d A 21 d a 21 = 0 , d A 21 d a 22 = 0 , d A 21 d a 31 = 1 , d A 21 d a 32 = 0 \frac{dA21}{da21}=0,\frac{dA21}{da22}=0,\frac{dA21}{da31}=1,\frac{dA21}{da32}=0 da2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值