在许多介绍图像识别任务的介绍中,通常使用着名的MNIST数据集。
但是,这些数据存在一些问题:
1.太简单了。例如,一个简单的MLP模型可以达到99%的准确度,而一个2层CNN可以达到99%的准确度。
2.它被过度使用。从字面上看,每台机器学习入门文章或图像识别任务都将使用此数据集作为基准。但是,因为获得近乎完美的分类结果非常容易,所以它的实用性会受到打折,并且对于现代机器学习/ AI任务并不真正有用。
可下载资源
因此,出现Fashion-MNIST数据集。该数据集是作为MNIST数据的直接替代而开发的,其意义在于:
1.尺寸和风格相同:28×28灰度图像
2.每个图像与10个类中的1个相关联,即:
0:T恤/上衣,
1:裤子,
2:套头衫,
3:连衣裙,
4 :外套,
5:凉鞋,
6:衬衫,
7:运动鞋,
8:背包,
9:靴
自从2012年,卷积神经网络AlexNet在图像分类竞赛中取得突破性进展之后,深度学习进入快速的发展期,在此后的五六年的期间,出现了一些经典的卷积神经网络模型,这里对这些模型做一些介绍。
1 VGG
在2014年的ILSVRC, 牛津大学VGG(Visual Geometry Group)组提出一种简洁的卷积神经网络模型,即VGG模型。VGG模型非常的整洁和规范,可以看作是卷积神经网络的一种基础模型,在很多的实际任务中,都会先训练一遍VGG模型,看看效果如何,然后再采用其它的模型和做各种优化,以提高任务成绩。值得一提的是,在ImageNet上,首次公开超过人眼识别的模型就是借鉴VGG模型。
VGG的核心是五组卷积操作,每组卷积之后做最大池化,然后是全连接层与分类层。在VGG中使用的卷积核大小是3*3,这也是卷积神经网络中最常见的卷积核尺寸之一。特征图的通道数目从64上升到128,再到256和512,同一组卷积内通道的数目相同。
另外需要注意的是,由于每组的卷积层数目可以不同,VGG模型有11、13、16、19等几种。
2 GoogleNet
GoogleNet也出现在2014年,并在这年的ILSVRC获得了冠军。GoogleNet共22层网络,它是一个即“深”又“宽”的模型,最明显的标志是其中的Inception模块,可以说GoogleNet主要是Inception模块堆积而成的。
GoogleNet网络结构:开始为卷积,然后为三组Inception子网络,再接平均值池化层、全连接层。其中,第一组子网络包含2个Inception模块,第二组包含5个Inception模块,第三组包含2个Inception模块。
如下图所示,Inception有简单的类型和带有降纬的类型。简单的Inception模块是3个卷积操作和一个池化操作的拼接,其中卷积操作采用了1*1、3*3、5*5的三种大小的卷积核。
1*1的卷积核也是卷积神经网络中,非常常见的设计,它可以用来改变特征通道的数目。在卷积神经网络中,经过几层卷积后,通道数会越来越大,导致参数和计算量也随之增大。为了应对这个问题,可以采用1×1卷积核进行降维。如右下图所示的Inception类型,采用了3个1×1卷积层进行降维,即减少特征通道的数目。
3 ResNet
神经网络的设计一般遵循深度优先的原则,深度可以说是对网络性能影响最大的一个元素。但是越深的神经网络越难以训练,在残差网络ResNet出现之前,这是一个很大的问题。
在2015年的ImageNet图像分类、图像物体定位和图像物体检测比赛中,孙剑博士与何凯明博士设计的残差网络ResNet取得了冠军。ResNet中采用了残差模块的设计,解决了网络深度增加后准确度下降的问题,并且训练收敛较快,成功的训练了近千层的卷积神经网络。
下图为ResNet中50、101、152层网络连接示意图,使用的是瓶颈模块。这三个模型的区别在于每组中残差模块的重复次数不同(见图右上角)。
残差网络引入了残差模块,每个残差模块包含两条路径,一条路径为直连通路,另一条为两到三次卷积操作得到的特征残差,然后将两条路径的输出相加。在这里需要特别说明的是,残差的思想在神经网络设计中影响非常大,在很多种类的神经网络中,都能看到残差的结构。
残差模块如图所示,左边是基本模块连接方式,右边是瓶颈模块(Bottleneck)连接方式。基本连接方式由两个输出通道数目相同的3×3卷积组成。瓶颈的意思是上面的1×1卷积用来降维即256->64,下面的1×1卷积用来升维即64->256,使得中间3×3卷积的输入和输出通道数目都较小即64->64。
4 DenseNet
在残差网络之后,又出现了密集网络DenseNet(这个应该是受到了残差思路的影响)。密集网络顾名思义,它的连接更为密集,最明显的标志是密集模块即Dense Block。在Dence Block中,每一层都与其他层”沟通“,这种密集的联系,使得信息流最大化,也实现了特征的重复利用。同时网络的每一层可以被设计得特别”窄“,即只使用了比较少的特征图,可以达到降低冗余的目的,这使得DenseNet的计算量也比较小。
整个DenseNet是由若干个Dense Block串联而成的,在每个Dense Block之间有一个Convolution+Pooling的操作,这个被称为是transition layer。
后记
在这篇文章为大家介绍了,VGG、GoogleNet、ResNet及DenseNet这几种常用的卷积神经网络模型,这些都是非常好的学习示例,通过学习这些卷积模型,可以对如何设计卷积神经网络有更深入的认识。
3. 60000训练样本和10000个测试样本,以下是一些样本的截图:
自从它出现以来,已经有多份提交文件来对这些数据进行基准测试,其中一些能够达到95%以上的准确度 。
我也试图用keras来对这个数据进行基准测试。keras是构建深度学习模型的高级框架,在后端选择TensorFlow,Theano和CNTK。它很容易安装和使用。对于我的应用程序,我使用了CNTK后端。
在这里,我将以两个模型为基准。一种是层结构为256-512-100-10的MLP,另一种是类VGG的CNN。
第一个模型在100个历元后的测试数据上达到了[0.89,0.90]的精度,而后者达到了45个时期后的测试数据的精度> 0.94。
我们先用tSNE来看它。据说tSNE是最有效的降纬工具。
我使用了1000个样本来快速运行。如果您的PC速度足够快并且有时间,则可以针对完整数据集运行tSNE。
为了建立自己的网络,我们首先导入一些库
该模型在大约100个时期的测试数据集上达到了近90%的准确度。现在,我们来构建一个类似VGG的CNN模型。我们使用类似于VGG的体系结构,但仍然非常不同。由于图形数据很小,如果我们使用原始VGG体系结构,它很可能会过度拟合,并且在测试数据时表现不佳,这些数据在上面列出的公开提交的基准测试中观察到。在keras中构建这样一个模型是非常容易的:
这个模型有150万个参数。我们可以调用’fit’方法来训练模型:
model3_fit=model3.fit(X_train, Y_train2, validation_data = (X_test, Y_test2), epochs=50, verbose=1, batch_size=500)
经过40次以后,这个模型在测试数据上获得了0.94的精度。显然,这个模型也存在过度拟合问题。我们稍后会解决这个问题。
可下载资源
关于作者
Kaizong Ye是拓端研究室(TRL)的研究员。在此对他对本文所作的贡献表示诚挚感谢,他在上海财经大学完成了统计学专业的硕士学位,专注人工智能领域。擅长Python.Matlab仿真、视觉处理、神经网络、数据分析。
本文借鉴了作者最近为《R语言数据分析挖掘必知必会 》课堂做的准备。
非常感谢您阅读本文,如需帮助请联系我们!