接上篇:卷积神经网络对图片分类-中
9 ReLU(Rectified Linear Units) Layers
在每个卷积层之后,会马上进入一个激励层,调用一种激励函数来加入非线性因素,决绝线性不可分的问题。这里我们选择的激励函数方式叫做ReLU, 他的方程是这样f(x) = max(0, x),就是把小于零的值都归为0,好处是可以是网络训练的更快,减少梯度消失的问题出现。具体如何理解,例如:
上图A中可以通过一条直线来区分2种不同类型的数据点,然而B就不可以。但是调用激励函数经过变换之后就可以对它们进行很好的区分。
10 训练
到目前为止大家肯定会有一些疑问,卷积层是如何知道提取哪些特征图像,过滤器里的权重值是如果被确定的,全连接层是如何进行对比的。
接下来我们就来看看,网络是如何被训练的。其实网络在训练的过程中计算机是通过反向传播算法来调整过滤器的权重值。在讲解反向传播算法之前我们先来看一个类比。
当我们生下来的时候,我们的思想是崭新的,不知道什么是鸟什么是狗。类似在CNN在开始训练之前,权重值也是随机初始化的,过滤器不知道提取哪些特征值。当我们长大一些的时候,父母和老师给我们看不同的图片并且告诉我们这些图片对应的是什么。这种思想或者方法就是给图片打标签,就是CNN训练的过程。在CNN训练之前,其实我们已经有一些训练样本,里面有成千上万张猫,狗,鸟,船的图片,并且每一张图片都有一个对应的标签说明它是什么动物,例如有一张训练图片被标记为狗,它的标签是[0 0 0 1 0 0 0 0 0 0],属于它的分类对应的位置被标记为1,其他不属于它的分类位置被标记为0值。
反向传播算法可以分成4个不同的部分,向前传递,损失函数,反向传递,更新权重。在向前传播过程中,你拿到一张训练图片28X28X3的数组,通过网络传递它。刚开始所有的权重值都被随机初始化,它们可能会是这样一些随机值[0.3, 0.1, 0.4, 0.2, 0.3....]。网络通过初始化的权重值,是无法提取准确特征图像 ,因此无法给出任何合理的结论,图片属于哪种类别。这时我们就需要反向传播中的损失函数来帮助网络更新权重值找到想要的特征图像。损失函数的定义方式有很多种,但是一种常用方式的是MSE(mean squared erro)均方误差。
这里target就是图片的真实分类值,output就是图片通过网络训练出来的分类值,然后调用均方误差就得到了损失值。这个损失值在网络刚开始训练的时候可能会很高,这个很好理解因为权重值都是随机初始化出来的。我们的最终目的就是想要得到预测值和真实值一样。为了达到这个目的,我们就需要尽量减少损失值,损失值越小就说明预测结果越接近。在这一个过程中,我们就需要不断的调整权重值,来寻找出哪些权重值能使网络的损失减小。具体怎样来寻找这些权重值,就需要使用到梯度下降算法。它的示例图如下:
刚开始在曲面上有一个点,这个点就是我们的初始化权重,然后不停的更新权重值,让这个点沿着曲面的边缘慢慢下降,最终降到最低点,得到一个很小的损失值。在训练的过程中,你可以指定一个下降速率或者叫做训练速率,也就是这个点每次移动的步伐。给一个大的训练速率意味着权重在更新的时候步伐更大,训练的速度更快,但是当你给的值太大时就有可能在快达到最低点时跳跃过它,这样就获取不到最佳权重值了。
做一次前向传递,损失函数,反向传递和参数更新的过程通常被称为one epoch。 每次训练都会指定完成epoch的次数,然后程序就会不断重复这一过程,当最后一轮训练结束之后,我们的网络也就被训练好了,得到了训练出来的一些权重值。
11 测试
最后,为了检测训练出来的CNN模型是否准确,我们需要一些不同的图片和标签,把他们传递给CNN,用预测出来的结果和真实结果做一下对比就可以知道训练出来的模型是否准确了。
(完)
参考:
http://neuralnetworksanddeeplearning.com/chap6.html#convolutional_neural_networks_in_practice
https://adeshpande3.github.io/adeshpande3.github.io/A-Beginner's-Guide-To-Understanding-Convolutional-Neural-Networks/