这篇文章用最简明易懂的方式解释了卷积神经网络(CNN)的基本原理,并绕开了里面的数学理论。
同时,如果想对从头开始构建CNN网络之类的问题感兴趣,作者推荐去读《 Artificial Intelligence for Humans Volume 3: Deep Learning and Neural Networks》中第10章节的内容。
不多说了,开始CNN之旅——
网络结构
CNN的模型通常建立在前馈神经网络模型之上,它的结构你也应该不陌生。不同是的,“隐藏层”将被以下这些层取代:
- 卷积层(Convolutional Layers)
- 池化层(Pooling Layers)
全连接层(稠密层,Dense Layers)
结构类似下图:
卷积
在此阶段,输入图像被一个grid扫描,并作为输入传递到网络。之后,这个网络将一层卷积层应用于输入的图像,将它分割成包含3张图像的三维立方体结构。这3三张图像个框架分别呈现原图的红色、绿色和蓝色信息。
随后,它将卷积滤波器(也称神经元)应用到图像中,和用PhotoShop中的滤镜突出某些特征相似。例如在动画片《Doc And Mharti》中,用罗伯茨交叉边缘增强滤波器处理过的效果如下图所示:
原图
处理后
可以想象,拥有100多个不同滤波器的神经网络筛选复杂特征的能力有多强大,这将大大助力它识别现实世界中事物。一旦神经网络已经将卷积滤波器应用到图像中,我们就能得到特征/激活图。
特征图谱会被指定区域内的特定神经元激活,比如我们将边缘检测滤波器添加到下面左图中,则它的激活图如右图所示:
这些点代表0的行(表明这些区域可能是边缘)。在二维数组中,“30”的值表明图像区域存在边缘的可能性很高。
激活层
当我们有了激活图,就能在其中让激活函数大显身手了,我们用研究人员的***函数——ReLU激活函数(修正线性单元)举个例子。然而,一些研究人员仍然认为用Sigmoid函数或双曲切线能得到提供***的训练结果,但我不这么认为。
使用激活层是在系统中引入非线性,这样可以提高输入和输出的一般性。ReLU(x)函数只返回max(0、x)或简单地返回激活图中的负权值。
池化层
之后的***做法通常是在特征图中应用***池化(或任何其他类型的池)。应用***池化层的原理是扫描小型grid中的图像,用一个包含给定grid中***值的单个单元替换每个grid:
这样做的重要原因之一是,一旦我们知道给定特征在一个给定的输入区域,我们可以忽略特征的确切位置将数据普遍化,减少过拟合。举个例子,即使训练精度达到99%,但拿到没见过的新数据上测试时,它的精确度也只有50%。
输出层
***池化层后我们讲讲剩下的另一个激活图,这是传递给全连接网络的一部分信息。它包含一个全连接层,将上一层中每个神经元的输出简单映射到全连接层的一个神经元上,并将softmax函数应用到输出中,就是和我们之前提到的ReLU函数类似的激活函数。
因为我们将用神经网络将图片分类,因此这里使用了softmax函数。softmax输出返回列表的概率求和为1,每个概率代表给定图像属于特定输出类的概率。但后来涉及到图像预测和修复任务时,线性激活函数的效果就比较好了。
值得注意的是,讲到这里我们只考虑了单卷积层和单池层的简单情况,如果要实现***精度通常需要它们多层堆叠。经过每个完整的迭代后,通过网络反向根据计算损失更新权重。