如何完成卷积神经网络有关的毕业设计

前言

    毕业设计对于每个学生而言都是一种十分痛苦的渡劫仪式,尤其是当你拿到的是完全陌生的毕业设计的时候,内心无疑有各种王尼玛从心中飘过。我在这里聊聊我在完成毕设的过程中得到的一些经验教训。因为我的毕业设计主题是卷积神经网络,所以在这里我的话题也仅仅局限于卷积神经网络这方面的内容。

准备篇

    先介绍我的毕业设计,我的毕业设计简而言之是完成一个实现图像分类任务的卷积神经网络的项目,其中包括训练数量和用于识别(而且后期还“被”加了批量识别图片的需求)两个部分。一开始看到题目的时候内心还是懵逼的,卷积神经网络是啥?它怎么能完成模式识别的?这个时候我做了一件最蠢的事情就立马去买了一本机器学习的教材(黑色封面,页数挺多的那种),然后我勉强看了绪论就把它束之高阁了,当然我不是在嫌弃这本书质量如何,只是当时我是带着一种功利的目的去看书,我会有闲情去区分有监督、无监督、半监督有什么区分么?确实在完成毕设的时候有些基础理论是有必要去补充的,然而光顾着埋头打地基而忘了往上添砖加瓦,不管你的基础打得有多牢固,最终评审首先要看的是,你到底要没有达成毕设的基本要求。
    于是我在打理论基础这块主要是通过百度“入门”“速成”之类的关键词,虽然一直鄙视“入门”、“速成”这种字眼,就像好多人一直鄙视谭浩强一样,但是效果上来看这对小白至少能起到启发的作用。至少知道了机器学习里有各种各样的神经网络,深度学习只是其中的分支;还知道了感受野、权值共享大致是什么东西;虽其中许多言论真假难辨,但从多家之言里拼凑出了整个毕业设计的轮廓(管你真的假的,我又没记住)。然后随着知识的积累可以去阅读有关文献,当然你和我一样耐心不足并且时间不充裕的话还是以期刊为主,最好这篇期刊包含着一些基础知识和应用的文字(会有的,有的文章在介绍他的创新点之前全程在水)。
    在我差不多了解卷积神经网络整个运作的流程之后就要开始做毕设了,我个人比较推荐去借助一些第三方框架去做,有些人觉得这是一种作弊行为但是实际上这么做并不算作弊,就像你用编译器编程一样不算作弊一样,通过第三方框架我们可以专注更多的经历在网络结构的优化。而且你实际去用第三方框架的时候你会发现,虽然有一定的文档说明,但看不看得懂是个问题(全英文),能不能运行得起来(环境配置、如何调用指令),能运行得出怎样的识别率都算是个问题——这怎么算作弊?作弊哪有这么难的?/(ㄒoㄒ)/~~

方案篇

    虽然一直说计划赶不上变化,但是在正式进入编程阶段之前你必须要为下一个步骤,我结合我的经验觉得在做方案的时候考虑到接下来的内容:

  • 硬件环境。毕竟卷积神经网络乃至整个机器学习的训练都要经过大量的运算,其中CPU运算、显卡运算能力,甚至硬盘的读写速度都要接受不小的考验,其中我认为显卡是最重要的一环,因为现在深度学习的运算主要依赖的是显卡,以轻量级的MNIST训练为例,用GTX1080训练几千世代用一两分钟就结束了,而CPU模式就需要几个小时,建议你向你的导师申请一台搭配顶级显卡的电脑,就算申请不到也要确认你的电脑显卡可以足够用(什么叫做足够我不敢保证,但是值得注意的是你要用显卡进行训练的话,还需要用到足够的显存否则程序会禁止运行,512M的就算了吧,随随便便就超了)。PS:如果硬件环境不能满足的话真的要联系导师换题目了。
  • 软件环境。如果你接受我前文的建议使用第三方的话,你将会遇到一系列的麻烦(虽然这比从0开始好得多得多)。我姑且列举几点:
    • 操作系统:用win还是用linux?linux里面还分Ubuntu、Debian等等分支呢。
    • 第三方工具:用谁的工具?TensorFlow?Caffe?
    • 环境搭建:环境搭建起来容不容易,最好能一键安装的那种(然而一般并不能)

    这些问题要回答起来其实很简单:网络上用的人多、教程多、安装操作简单就可以了。如果有学长学姐帮你搭好了,不要犹豫,就用他们的,因为搭建环境可能会出现各种各样的蜜汁问题,记得那时候环境的问题前后总共耗费了我两个月左右的时间(想想内心都是崩溃的0 0)。我当时选择的是使用Caffe在Ubuntu下进行操作,用Ubuntu是因为Ubuntu里依赖项的修改相对win比较容易,网络教程也是Ubuntu的居多,用Caffe是因为他支持MATLAB这个我正好掌握的语言(虽然Python才是现在机器学习的流行语言,可是我恰好不会(⊙﹏⊙)b)。

编程篇

    要学会一门语言,我们要先学会hello world;要学会深度学习的工具,要先学会怎么把样例运行成功。在网上或者第三方工具里都会有许许多多的样例。试着把他们其中之一运行成功。过程中你可能会看到各种各样的报错,这可能是你文件路径的问题,也可能是你之前环境搭建的问题。
    当你学会使用样例的时候并不代表你真的掌握了这个工具,这个时候你应该会很好奇里面的数据是怎么读取的,里面的神经网络是怎么定义的,好了,现在是时候把你的数据都放进去了训练了,而这时候,这个样例就成为了你未来毕设程序的框架。而放进去的时候你要面对的问题大概如下:

  • 数据格式:可能之前样例的数据是数据库的模式,而你的数据是图片或者其他形式,这个时候你可能要考虑把你的数据转换成样例所用的格式,当然一款流行的第三方深度学习框架支持多种的数据格式,你也可以试着修改一下网络的输入层让它支持你的数据,当然这里面的时间成本要自行评估好。我的数据是图片的,样例是数据库的,然后caffe正好自带图片转数据库的工具,我用终端生成标记文本之后调用一下就好了。
  • 数据规格:可能之前样例是225x225的图片,而你的数据虽然是图片但是70x70甚至每一个图片都是不一样的。你需要把你的数据统一规格,如果是图片就统一长宽(而且一般图片长宽都是相等的),记得我当初win里面用一款轻量级的看图软件自带的批量转换大小的功能处理好了。
  • 网络设置:现在还在初级阶段,首要的问题还是兼容问题,所以我们尽量不去修改网络的隐含层,要关注的是输入层(部分教程也叫做数据层,其实也就是网络开始进来的第一个层了),还有一个地方就是最后全连接层,切记,最后一个全连接层输出有几个,就代表的你的网络是几分类的网络。
  • 指令执行问题:在执行程序的时候你可能会用到终端(类似win的命令行),为了减少下次在此执行时你可能会出现的操作失误,建议你在终端上的所有指令都保存在一个脚本上,以方面下次使用。
  • 数据分配:一般的,你的所有数据会分成几个类别,训练的时候应不应该把每个类别的数据数量设置成相同我个人不置可否,但是,最起码的,你好歹应该验证的时候设置成一致吧?记得那个时候我论文写到接近末尾写数据结果的时候,我突然发现总体识别正确率是90%以上,但是4个类别有两个类别是30%以下,这个时候我先是黑人问号脸,然后忽然发现这两个类别的数据量正好远远少于其他类别的数据量。这个时候离截止日期都没几天了我又不在学校,同时还在学校的学弟学妹同学们一个比一个萌(sha),甚至这个时候系统又崩溃了(没错,“又”),那几天我远程呼叫真的是受了不少惊吓。

数据验证篇

    当你的训练程序开始完美运行,或许你这个时候应该松一口气了,去喝茶回来看着训练程序的运行结果显示:accuracy :0.9,perfect!!!!但这个时候你最好再用你的识别程序去把整个验证集在识别一遍。这个时候你会发现出来的结果可能会和0.9有所出入。
    问题出现在哪了?其实问题就出在accuracy是怎么计算的,一般的,卷积神经网络是一边训练的一边验证的,而验证是如何进行的呢?可能每个工具都有所不同,但是每次验证操作的数据量是可以设定的,一般而言推荐设定是大于或等于验证集,这也是为什么accuracy会跟真实的accuracy有所区别的原因。当然我在论坛里还收到了另一种说法是不同语言对于精度的计算存在差异。(参考链接:http://caffecn.cn/?/question/1234 ,嗯,我是那个问问题的)

总结

    按理说,应该还有一个“网络改进篇”的,因为用样例的神经网络可能对我们的数据可能识别率较低,这个时候我个人推荐的解决方案是要么换个数据(还记得前文我那倒霉的30%识别率么,我就是急中生智换了一个更多数据量的数据才得以解决)或者根据识别率的走向趋势,如果是欠拟合的情况下可以增加训练世代(iteration)来提升网络泛化能力。当然你或许想搭建一个自己的网络结构来进行改善,但是如何构建网络层次这个问题其实还是个国际性难题,作为才看了“速成”教程的我们,恐怕只有依赖“玄学”才会提升识别率了。
    祝各位道友渡劫成功!

posted @ 2017-07-21 18:36  MrYu4  阅读(95)  评论(0编辑  收藏  举报