前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Fast.ai深度学习实战课程 Lesson7 学习笔记:CNN Architectures

Fast.ai深度学习实战课程 Lesson7 学习笔记:CNN Architectures

作者头像
AI科技大本营
发布2018-04-27 14:39:20
8800
发布2018-04-27 14:39:20
举报

本篇是AI100学院此前重点推出的《Fast.ai 深度学习实战课程》(中文字幕)第七节的学习笔记,分享者胡智豪。 如果你对深度学习感兴趣,该系列课程千万不要错过哦!

简述

本节课的内容比较多,但主要还是围绕着Fisheries竞赛,当中提出了许多前面的课程没见过的技巧和模型,例如使用了Resnet、InceptionV3模型,在网络结构上去掉全连接层,直接使用全卷积网络(Fully Convolutional Net),甚至Dropout层这些我们之前常用的层都不需要了。当中还介绍了kaggle竞赛的技巧,利用Data Leakage来提高成绩,还有利用一位参赛选手的贡献,提高模型的性能等等。

▌任务流程

1.利用ResNet提高猫狗大战的成绩

视频一开始,jeremy介绍了ResNet的结构,ResNet以它的层数之深著称,而理论上,模型的层数越深,识别图片的效果越好,因此作者甚至把它做到了1000层!另外有一些工作者,提出用50层ResNet + 一堆激活函数的结构性能就已经比1000层纯ResNet要好,因此Jeremy利用50层的结构来提高猫狗大战的成绩,最终做到99%以上的准确率。这一部分可以算为lesson3的延伸,因此Jeremy就没有把它列在了本节课的编程内容中,有兴趣的同学可跟着视频去做。

2.Data Leakage

Data Leakage是Kaggle比赛当中经常出现的情况,意思为一些与数据集本身内容无关或者相关程度很低的信息,往往能利用这些信息来提高预测的准确度。以Fisheries竞赛为例,此比赛的图片数据是由不同的船上不同的相机拍摄的,而这些船往往是专门出海捕捞一种鱼,因此暗示我们可能可以利用照片的尺寸(不同的相机拍摄有不同的尺寸)、或者照片中船只的样子(可能神经网络并不是识别鱼而是识别了船只),来预测这些图片中有某种鱼。这个技巧在kaggle比赛中不算作弊,相反所有人都可以用(只要你找得出),但对于实际工业应用就不行了,因为模型的泛化能力很低,这技巧只能用在竞赛中。以下是各种图片尺寸的数量:

我们利用Data Leakage来为模型增加一个输入——照片的尺寸,那么模型就变成了一个多重输入的模型。

3.Bounding Box

竞赛中有一位选手手动把数据集图片当中的鱼,用红框全部框出来了!因此我们可以利用这一个数据,作为模型的第二个输出,即除了让模型来预测图片里面有哪种鱼,还要预测出这条鱼在图片的什么位置!这样一来通过SGD,模型能不断修正预测出的位置框,使其与我们人工标注的方框尽可能重合,那么,相当于由我们人类来“教”模型该往哪些位置来寻找鱼类,人机合作!

4.Fully Convolutional Net(FCN)全卷积网络

这部分是本节课最酷的地方!我们以前利用VGG来修改后面的bn_layers,一般都包含Dense、MaxPooling、Dropout、BatchNorm层,但现在我们全部换掉!以前我们默认图片的大小是224x224,现在使用640x360大小的图片作为输入,那么以前用的全连接层就不适用了(因为shape不一致),而且图片尺寸变大后,Dense层的参数量将变得更加庞大。为了实现最后Dense层输出8个结果的效果,我们用多个卷积层来进行分类,最后输出8个结果,同时极大地减少了参数的数量!

而且最酷的是,可以利用这个网络,最后输出一个热力图,热力图上粉红色区域表示模型找到的鱼的位置,蓝色区域表示这些地方没有鱼!

5.InceptionCNN

InceptionV3是这两年来非常热门的模型,准确性比VGG高,仅次于Resnet,而参数量比VGG小,其独特的Inception结构让网络变得更深。Jeremy在最后一部分作为一个展示,利用几个Inception block,提高模型的预测准确性。详细的原理及应用Jeremy把它安排在了Part2,本次仅作为展示的形式,大家学完Part1之后继续学Part2吧!

▌概念解释

此部分重点解释一些本人认为在课程中有点难理解的部分,其它地方未涉及的见谅。

1.ResNet结构

本人按照Jeremy视频中的演示,画出了一张示意图,如图:

图中左边的结构是ResNet中每一个Block所包含的内容,有点像VGG的结构,唯一不同就在于,block的“输入”与block的“输出”用一个identity加了起来,ResNet的作者解释为,正因为有了这个identity的处理,使得模型在BackProp的时候在数学上不用担心梯度爆炸的问题,因此这个网络可以越叠越深。另外还有一些特性:

  • 图像数据在进入这些块(block)的时候,数据的维度是保持不变的,因为里面没有池化层的存在。
  • identity的处理是把块的输入(input_tensor)加上块的输出,这个input_tensor指的是这些块的输入,而不是指图片的原始数据输入。
  • 模型当中使用Average Pooling而不使用Max Pooling的原因是,形象地解释为Max Pooling专门看的是图片中的某一部分突出的地方,它能指出图片中某个地方是什么,而AveragePooling则专门看的是整张图片,看整张图片大体上像什么,而不管局部的细节。由于这个性质,AveragePooling常用于类似猫狗大战的图片识别中,因为图片的大部分都是猫或狗;但Average Pooling在Fisheries比赛中就不那么好了,因为Fisheries的每张图片中只有很少一部分是鱼,这时候Max Pooling才是最佳选择。
  • Clobal Average Pooling能够减少大量的参数,因此无需Dropout层。

2.Inception CNN

Jeremy给出的Inception block的搭建代码为:

把这代码以图的形式表示出来会帮助理解:

Jeremy指出,正是因为有了这些1x1的卷积层,极大地减少了参数的数量,使得Inception模型体积变小。同时一张图片每一层经过不同大小的卷积核,能识别出更加深层的信息。

3.Fully Convolution Networks

全卷积网络顾名思义就是网络中只包含卷积层,全卷积网络是一个非常酷的技术,常用于图片语义分割,按照Jeremy给出的链接,大家看以下两张图感受一下:

可以看出,以前我们的卷积神经网络只能识别出图中的物体属于哪个分类,现在FCN直接把图片中需分类的分类内容直接分割了出来,输出一张物体轮廓图,而且效果非常好。

▌代码解释

本文只对课程内核心代码进行解释,完整的代码可以点击这里下载。由于本节课代码量庞大,就不一一截图出来了,烦请直接下载ipynb文件,有问题的可以在这里回复或者邮件联系。

下载地址: http://geek.ai100.com.cn/wp-content/uploads/2017/05/lesson7_jto.ipynb

作者联系方式:justinhochn@gmail.com

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-05-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AI科技大本营 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档