训练集、验证集、测试集
在前面的介绍中,我一直使用数据一词来表达神经网络的输入。实际上这些数据在神经网络的不同阶段有不同的称呼。他们分别是训练集(Training Set)、验证集(alidation Set)和测试集(Test Set)。
训练集和验证集是在神经网络模型的训练阶段使用的数据,而测试集是在神经网络模型完成训练后,用于评估模型时所使用的数据。做一个简单的比喻,训练集就是的学生的课本,学生需要根据课本来学习知识(训练模型);验证集就是课后习题,学生通过课后习题来判断自己是否掌握了课本上的知识;测试集就是期末考试(评估模型),期末考试的题一般是课本和课后习题中没有,但是十分类似的题。
一个学生的成绩好不好,看下他期末考的好不好就知道了。一个神经网络模型好不好,看看它在测试集中的表现就知道了。
深度学习领域比较出名的数据集当属MNIST手写体数字数据集了,它包含了60000个训练样本和10000个测试样本。部分样本如下所示:
使用Google推出的深度学习框架TensorFlow,能够直接获取MNIST手写体数字数据集,代码如下:
代码中的train_features和test_features分别为训练集和测试集,即为手写字体数字的图片集合;train_labels和test_labels分别是训练集和测试集的图像所对应的标签,即0-9的数字集合。
MNIST数据集未提供验证集,工程上一般会从训练集中取出15%~20%的数据作为验证集,余下的80%~85%的数据作为训练集,用于完成训练过程。
使用LeNet-5做交通标志牌分类
了解以上内容后,就能大致理解神经网络的工作原理了。再补充一下TensorFlow的语法知识、看几个TensorFlow的例子,就可以自己动手搭建神经网络了。
如果面对复杂的图像处理问题,需要使用卷积神经网络(CNN)。卷积神经网络是由卷积神经网络之父Yann Lecun在贝尔实验室工作期间,为解决手写数字识别而提出的。卷积是一个特殊的函数,其在神经网络中的定位与四则远算或某些特殊函数的地位没有区别。
下面我们通过导入交通标志牌的训练集,使用卷积神经网络之父Yann Lecun提出的LeNet模型,训练一个能识别交通标志的神经网络。
首先导入交通标志牌的数据。优达学城(Udacity)无人驾驶工程师学位为我们提供了34799张图组成的数据集、4410张图组成的验证集和12630张图组成的测试。这些数据集一共包含了43种不同的标志牌,比如限速、转向、停车标志牌。部分训练集的样本如下图所示:
由于LeNet-5默认需要输入尺寸为(32 x 32 x 1)的单通道的图像,因此我将训练集、验证集和测试集都进行灰度、缩放和归一化处理。处理后的部分样本如下:
LeNet-5是一个不太复杂的卷积神经网络,下图显示了其结构。网络输入的是单通道的二维图像,先经过两次卷积层到池化层,再经过全连接层,最后使用softmax分类作为输出层。
图片出处:优达学城(Udacity)无人驾驶工程师学位
有关LeNet-5模型更详细介绍可以搜索文章《网络解析(一):LeNet-5详解》
在训练时会出现一个问题:训练集的准确率很高,但是验证集的准确率上不去。这表明模型训练时过拟合了,导致验证集只能达到89%左右的识别率,而课程的要求是达到93%以上。
为了解决模型过拟合导致的模型准确率低的问题,我做了两件事:
使用imgaug库做数据增广
使用imgaug库能够通过很简单的代码完成图像的翻转、平移、旋转、缩放、仿射变换、加噪声、修改颜色通道等功能。以实现数据库的增广,达到丰富训练集的目的。下图是imgaug库对同一张图片实现的数据增广的效果。
图片出处:https://github.com/aleju/imgaug
我对交通标志牌训练集添加随机噪声、修改对比度和横向翻转操作,完成了数据集增广。
在LeNet-5模型的全连接层后加入了Dropout函数
在LeNet-5网络中加入Dropout函数,能够让网络不会太依赖某些参数,因为这些参数随时可能被丢弃掉。在训练时,网络会被迫地学习一切的冗余表示,以确保至少将某些重要信息保存下来。当网络中的某个参数被丢弃时,还有其他参数能够完成相同的工作,这就是Dropout的功能。
在网络中加入Dropout函数的方式可以使得网络更加稳固,并能防止过拟合。
应用数据增广和Dropout函数后,重新训练即可使模型在测试集中的准确率超过93%,达到要求。
结语
以上就是《深度学习入门之交通标志分类》的全部内容。文中的部分源码、图片和数据集来自优达学城(Udacity)无人驾驶工程师学位的第三个项目。
在这次分享中,我介绍了深度学习中所涉及的有关神经网络的理论知识。包括神经网络中的参数,反向传播原理,训练集、验证集和测试集的区别。在正文的最后介绍了如何利用LeNet-5网络实现交通标志牌的分类工作,当分类效果不理想时,分析原因并提供了解决方案。
在无人驾驶领域,深度学习除了用于识别图像中的物体外,还在激光点云分类障碍物、障碍物的轨迹预测、端到端的运动控制等领域得到了广泛应用。为现阶段无人驾驶技术的发展提供了巨大的帮助。掌握深度学习的理论知识和应用方法能够帮助我们解决无人驾驶领域很多棘手的问题。