前两个笔记笔者集中探讨了卷积神经网络中的卷积原理,对于二维卷积和三维卷积的原理进行了深入的剖析,对 CNN 的卷积、池化、全连接、滤波器、感受野等关键概念进行了充分的理解。本节内容将继续秉承之前 DNN 的学习路线,在利用搭建神经网络之前,先尝试利用手动搭建卷积神经网络,以期对卷积神经网络的卷积机制、前向传播和反向传播的原理和过程有更深刻的理解。
单步卷积过程
在正式搭建 CNN 之前,我们先依据前面笔记提到的卷积机制的线性计算的理解,利用定义一个单步卷积过程。代码如下:
在上述的单步卷积定义中,我们传入了一个前一层输入的要进行卷积的区域,即感受野,滤波器,即卷积层的权重参数,偏差,对其执行的线性计算即可实现一个单步的卷积过程。
CNN前向传播过程:卷积
正如 DNN 中一样,CNN 即使多了卷积和池化过程,模型仍然是前向传播和反向传播的训练过程。CNN 的前向传播包括卷积和池化两个过程,我们先来看如何利用基于上面定义的单步卷积实现完整的卷积过程。卷积计算并不难,我们在单步卷积中就已经实现了,难点在于如何实现滤波器在输入图像矩阵上的的扫描和移动过程。
这其中我们需要搞清楚一些变量和参数,以及每一个输入输出的,这对于我们执行卷积和矩阵相乘至关重要。首先我们的输入是原始图像矩阵,也可以是前一层经过激活后的图像输出矩阵,这里以前一层的激活输出为准,输入像素的我们必须明确,然后是滤波器矩阵和偏差,还需要考虑步幅和填充,在此基础上我们基于滤波器移动和单步卷积搭建定义如下前向卷积过程:
这样,卷积神经网络前向传播中一个完整的卷积计算过程就被我们定义好了。通常而言,我们也会对卷积后输出加一个激活操作,正如前面的图2所示,这里我们就省略不加了。
CNN前向传播过程:池化
池化简单而言就是取局部区域最大值,池化的前向传播跟卷积过程类似,但相对简单一点,无需执行单步卷积那样的乘积运算。同样需要注意的是各参数和输入输出的,因此我们定义如下前向传播池化过程:
由上述代码结构可以看出,前向传播的池化过程的代码结构和卷积过程非常类似。
CNN反向传播过程:卷积
定义好前向传播之后,难点和关键点就在于如何给卷积和池化过程定义反向传播过程。卷积层的反向传播向来是个复杂的过程,中我们只要定义好前向传播过程,反向传播会自动进行计算。但利用搭建 CNN 反向传播就还得我们自己定义了。其关键还是在于准确的定义损失函数对于各个变量的梯度:
由上述梯度计算公式和卷积的前向传播过程,我们定义如下卷积的反向传播函数:
CNN反向传播过程:池化
反向传播中的池化操作跟卷积也是类似的。再此之前,我们需要根据滤波器为最大池化和平均池化分别创建一个和一个:
然后整合封装最大池化的反向传播过程:
这样卷积神经网络的整个前向传播和反向传播过程我们就搭建好了。可以说是非常费力的操作了,但我相信,经过这样一步步的根据原理的手写,你一定会对卷积神经网络的原理理解更加深刻了。
注:本深度学习笔记系作者学习 Andrew NG 的 deeplearningai 五门课程所记笔记,其中代码为每门课的课后assignments作业整理而成。
参考资料:
https://www.coursera.org/learn/machine-learning
https://www.deeplearning.ai/
领取专属 10元无门槛券
私享最新 技术干货