# 利用CNN实现的Tiny-ImageNet数据集识别
#### 介绍
《python与深度学习基础》第二次大作业
组长 王顺祯 PB16020628
组员 刘潇扬 PB16020656
组员 陆轶扬 PB16020602
组别 17组
基于Python3.7版本 Tensorflow 1.13.1版本 数据集为www.bitahub.com网站所提供
#### 任务说明
Tiny-ImageNet数据集是2016年由斯坦福大学发布的图像分类数据集,用作CS231N课程使用。它是ImageNet的子集,包含200类,每个类有500张训练图片,50张验证图片,50张测试图片。
Tiny-ImageNet的识别作为一个深度学习领域的经典项目引起了我们的兴趣,我们通过课程学习以及自学的相关知识,在参照现有的网络基础上基于此数据集来开展了相关的工作。
任务的难点主要在于我们虽然进行了课程的学习,但是仅仅停留在理论的层面,在实际构建神经网络的领域内我们还只是一群新手,基本上是从零学起。所以在课后我们进行了大量的自学,学习CNN的相关知识,研究他人的网络构建以及代码的呈现,并在此基础上对于网络进行了优化和调整。尽管网上的现成代码很多,但很多代码本身是不严谨的,甚至是有错误而不能运行的,而且很多网络结构本身并不是很好,很多细节都没有做到位,甚至有的连学习率都没有设置。因此我们参照了许多类似的工作,在一个已有的网络上进行了优化和调整,才有了现在的结果。
#### 数据处理
本作业使用的数据集为Tiny ImageNet 200。Tiny ImageNet 200是斯坦福大学的cs231n: Convolutional Neural Networks for Visual Recognition class课程为学生组织了一个类似于ImageNet挑战的图像分类挑战,但范围更小。本数据集共有200个图像类,其中500张图像用于训练,50张图像用于验证,50张图像用于每类测试,每张图像被预处理且裁剪成64*64*3像素大小。
#### 算法原理
卷积神经网络(CNN)
1.为什么要使用卷积神经网络
在图像处理领域,传统的全连接前馈网络会出现两个问题:
a、参数过多:对于一个输入图像,在全连接前馈网络中每一个隐藏层都有大量相互独立的连接,参数的规模会过于庞大,导致训练效率低下而且容易过拟合。
b、局部不变性特征:自然图像中的物体都具有局部不变性特征,而全连接前馈网络很难提取这些局部不变特征,一般需要进行数据增强来提高性能。 2卷积神经网络基础
a、目前的卷积神经网络一般是由卷积层、池化层和全连接层交叉堆叠而成的前馈神经网络,使用反向传播算法进行训练。卷积神经网络有三个结构上的特性:局部连接,权值共享以及池化。
局部连接:在卷积层(假设是第l 层)中的每一个神经元都只和下一层(第l−1层)中某个局部窗口内的神经元相连,构成一个局部连接网络。
权值共享:作为参数的滤波器w(l) 对于第l 层的所有的神经元都是相同的。
b、二维卷积
假设卷积层的输入神经元个数为n,卷积大小为m,步长(stride)为s,输入神经元两端各填补p个零(zero padding),那么该卷积层的神经元数量为:
(n − m + 2p)/s + 1。
c、网络中各个层的作用
卷积层:
卷积层的作用是提取一个局部区域的特征,不同的卷积核相当于不同的特征提取器。 卷积层的神经元和全连接网络一样都是一维结构。卷积网络主要应用在图像处理上,图像为二维结构,为了更充分地利用图像的局部信息,将神经元组织为三维结构的神经层,其大小为高度M×宽度N×深度D,有D个M × N大小的特征映射构成。
池化层:
池化层,其作用是进行特征选择,降低特征数量,并从而减少参数数量。卷积层虽然可以显著减少网络中连接的数量,但特征映射组中的神经元个数并没有显著减少。如果后面接一个分类器,分类器的输入维数依然很高,很容易出现过拟合。为了解决这个问题,可以在卷积层之后加上一个池化层,从而降低特征维数,避免过拟合。本实验选择使用最大池化(Maximum Pooling)即取一个区域内所有神经元的最大值。 全连接层:连接所有的特征,将输出值送给分类器也就是输出层。
输出层:对于图像分类问题,输出层使用逻辑函数或归一化指数函数(softmax function)输出分类标签。
#### 实验细节
卷积神经网络的卷积核大小、个数是影响神经网络性能的关键参数。在实验的过程中我们发现利用2个3×3卷积核的组合比1个5×5卷积核的效果更佳,使用小卷积核有效的提高了学习的正确率。
学习率作为监督学习以及深度学习中重要的超参数,其决定着目标函数能否收敛到局部最小值以及何时收敛到最小值。合适的学习率能够使目标函数在合适的时间内收敛到局部最小值。本程序中设置学习率为0.001,并使用了学习率衰减,每10步衰减为之前的一半。
激活函数是多层神经网络中,上层节点的输出和下层节点的输入之间具有的函数关系。引入非线性函数作为激励函数,给神经元引入了非线性因素,使得神经网络可以任意逼近任何非线性函数,这样神经网络就可以应用到众多的非线性模型中。本程序中的激活函数使用Relu函数。
在机器学习的模型中,如果模型的参数太多,而训练样本又太少,训练出来的模型很容易产生过拟合的现象。为了防止过拟合,可以通过阻止特征检测器的共同作用来提高神经网络的性能,即Dropout方法。在训练时,每个神经单元以某个概率p被舍去,这样可以使模型泛化性更强,因为它不会太依赖某些局部的特征。本程序中的Dropout率设置为0.3。
通过多次更改参数训练得到最优的结果,最终训练的epoch数为200,其他指标情况在上文中已有所说明。
#### 实验总结
通过本次大作业,我们在课程学习的基础上进一步了解学习了机器学习的相关知识,并学以致用,通过团队的合作,真正自己动手完成了这样一个项目。通过亲自动手调试CNN,我们基本实现了Tiny-ImageNet数据集中图像的分辨,虽然我们所用的网络借鉴了很多前人的成果,但是实际动手调参以及理解、改进网络结构的过程也非常有意义,让我们收获颇丰。在这个过程里,我们从刚开始的不了解逐渐到了后来的了解乃至初步的理解,也加深了我们对机器学习领域的兴趣,也许这也是这门课程的价值所在。
#### 小组分工情况
王顺祯:实验报告的撰写
刘潇扬:算法理论的调研
陆轶扬:代码的在线测试与参数调试
实际上的分工没有那么明确,很多工作也无法具体写清楚。
原始代码的搜索和初步修改是王顺祯同学完成的,而陆轶扬和刘潇扬同学也都在后续的调试以及原代码的修改过程中做出了许多工作,因此这项工作可以说是三人通力合作完成的。

飞翔的佩奇

- 粉丝: 7489
最新资源
- 学生信息管理系统软件工程.doc
- 基因工程104.ppt
- 嵌入式产品开发赛项试题.pdf
- 基于奔跑吧面条开源框架改造的Vue大数据可视化全屏展示项目-支持F11全屏展示和区域滚动配置的数据可视化大屏系统-用于政府企业数据监控和业务展示的响应式数据看板-采用Vue-cli.zip
- 移动通信复习提纲a.pptx
- 基因工程的基本操作程序.ppt
- 面向对象程序设计一PPT课件.ppt
- java-python开发-校招简历模板076.docx
- 工程项目管理方法存在问题.docx
- 2023年网络管理员实习日记.doc
- 项目管理-作业与自测.docx
- 智慧城市无线覆盖项目实施计划施工方案v.docx
- (源码)基于Jekyll框架的个人博客系统.zip
- 医疗行业办公自动化保密管理方案.pptx
- 基于ARM的失重秤设计嵌入式课程设计.doc
- 怎样提升工程项目管理.docx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈


