在深度学习的领域中,卷积神经网络(CNN)是一种强大的模型,它能够从图像中估计出人的年龄。本文是系列文章的第三篇,将引导完成深度学习流程中最困难的步骤之一:CNN的设计。CNN预测的准确性直接依赖于其结构——层的堆叠和参数。
层是构建CNN的基础。有许多不同类型的CNN层;最常用的包括:卷积层(CONV)、激活层(ACT)、全连接层(FC)、池化层(POOL)、归一化层(NORM)和丢弃层(DROP)。
卷积层是CNN的核心部分,得名于其包含的一组卷积(核)。这些核是小型的正方形矩阵,其系数是“可学习的”,即在CNN训练过程中被分配以优化预测。训练卷积层的核使网络能够从图像中提取局部特征和模式,然后决定哪些对分类有价值。一个CNN由多个顺序的卷积层组成,每一层都负责提取更抽象的特征。
激活层对数据应用非线性函数。非线性是解决分类问题的重要工具,因为几乎所有类别的问题都是非线性可分的。激活层通常在卷积层和全连接层之后使用。有许多激活函数:阶梯函数(STEP)、sigmoid函数(SIGM)、双曲正切函数(TANH)、线性整流单元(ReLU)、指数线性单元(ELU)等。ReLU函数可能是现代CNN中最常用的。
全连接层总是出现在CNN的末端。全连接层堆栈是CNN的另一个核心组件。本质上,全连接层堆栈是一个感知器网络。它接收卷积层提取的特征作为输入数据。在CNN训练期间,这个子网络优化其神经元的权重以最大化CNN的预测能力。
池化层通常用于连续的卷积层之间,以减小输入/输出数据的空间尺寸。归一化层通常跟在层后面,以将它们的输出归一化到单位范围内。丢弃层通常用于全连接层之间,以减少网络的连接性。
有一些常见的层堆栈模式,可以用来成功解决各种图像分类问题。当某个CNN赢得图像分类挑战时,该CNN的结构就成为了模式——标准网络架构——直到另一个CNN超越前者。一些定义模式的CNN包括:LeNet、WGGNet、ResNet、GoogLeNet和Xception。许多标准CNN架构在Keras框架中作为现成的类实现。可以使用这些类之一来解决年龄估计问题。然而,在本系列中,目标是展示完整的深度学习流程——因此,将使用自己的CNN架构,然后使用Keras库创建网络。
CNN结构建议如下...
如所见,CNN的输入数据是一个128 x 128像素的灰度图像。决定输入图像应该是灰度而不是彩色。为什么?因为认为对年龄估计重要的特征不是由颜色决定的;相反,它们是几何性质的。输入图像的大小——128像素平方——对于CNN来说是相当典型的,图像大小从24到256像素不等。
网络的第一部分由四个堆叠的子网组成。每个子网是卷积层、激活层和归一化层的序列。前两个卷积层使用5 x 5像素的核,最后两个使用更小的核——3 x 3像素。卷积核的数量,K,对于所有层都是相同的。它是CNN的参数,在网络初始化时分配,以处理不同复杂性的问题。卷积层使用填充来保持输入数据的空间尺寸。卷积子网中的激活层使用ReLU激活函数。
第二和第四个卷积子网包括池化层。这些层使用MAX池化函数,2 x 2核,2 x 2步长。这在每个池化层之后将每个空间维度减半。由于第一个池化层的输入大小为128 x 128像素,其输出为64 x 64像素。第二个池化层的输入大小为64 x 64像素,输出为32 x 32像素。请记住,所有这些都是空间尺寸。第三维——深度——对于所有层的所有输入/输出数据都是K。
CNN的最后一部分是一个“多层感知器”。它由两个具有ReLU激活函数的“隐藏”全连接层和一个输出全连接层组成。两个隐藏FC层有N个神经元——CNN的另一个参数——最后一个FC层有X个神经元,其中X是类别(年龄组)的数量。隐藏层的输出通过归一化层进行归一化。两个隐藏层之间有一个丢弃层,它减少了它们的连接性。丢弃概率为0.5,这意味着每第二个神经元连接被丢弃。输出FC层使用SOFTMAX激活。这种激活类型是分类网络中常见的输出层,因为它评估每个类别的概率。