一、概述
1. 数据集简介
本文使用的数据集是CIFAR-10,这是一个经典的数据集,包含了60000张32*32的彩色图像,其中训练集50000张,测试集10000张,如同其名字,CIFAR-10数据集一共标注为10类,每一类6000张图片,这10类分别是airplane、automobile、bird、cat、deer、dog、frog、horse、ship和truck。类别之间没有重叠,也不会一张图片中出现两类物体,其另一个数据集CIFAR-100则标注了100类。
更多CIFAR相关的信息请参见:http://www.cs.toronto.edu/~kriz/cifar.html
2. 模型简介
在本节的神经网络中,我们采用卷积神经网络CNN,还是用了一些新的技巧:(1)对权重weights进行L2正则化;(2)对图片数据进行数据增强,即对图片进行翻转、随机剪切等操作,制造了更多的样本;(3)在每个卷积-池化层后使用了LRN层(局部相应归一化层),增强了模型的泛化能力。
3. 数据增强DataAugmentation
数据增强在我们的训练中作用很大,包括了随机的水平翻转、随机剪切图片、设置随机的亮度和对比度以及对数据进行标准化等操作。它可以给单幅图增加多个副本,提高图片的利用率,防止对某一个图片结构的学习过拟合。如果神经网络能够克服这些噪声并准确识别,那么其泛化性能必然会很好。
二、程序解读
载入常用库部分首先要添加CIFAR-10相关的cifar10和cifar10_input模块,定义最大迭代轮数max_steps等宏观参数。
定义初始化权重weight的函数,使用截断的正态分布来初始化权重。这里通过一个参数wl来控制对weight的正则化处理。在机器学习中,无论是分类还是回归任务,都可能会因特征过多而导致过拟合问题,一般通过特征选取或惩罚不重要的特征的权重来解决这个问题。但是对于哪些特征是不重要的,我们并不能直观得出,而正则化就是帮助我们惩罚特征权重的,即特征的权重也是损失函数的一部分。可以理解为为了使用某个特征需要付出代价,如果不是这个特征对于减少损失函数非常有效其权重就会被惩罚减小。这样就可以有效的筛选出有效的特征,通过减少特征权重防止过拟合,即奥卡姆剃刀原则(越简单越有效)。L1正则化会制造稀疏的特征,大部分无用的特征直接置为0,而L2正则化会让特征的权重不会过大,使特征的权重比较平均。对于实现L2正则化,有两种方法,tf.multiply(tf.nn.l2_loss(var), wl)其中wl是正则化系数;tf.contrib.layers.l2_regularizer(lambda)(var)其中lambda是正则化系数。
随后使用cifar10模块来下载数据集并解压、展开到默认位置。再用cifar10_input模块来产生数据。其中cifar10_input.distorted_inputs()和cifar10_input.inputs()函数都是TensorFlow的操作operation