lesson7cnn architecture-fastai
课程https://v.qq.com/x/page/e0398lijt8h.html
讲解:
http://www.sohu.com/a/144583206_697750
resnet可以看作VGG16来使用,Resnet50中50表示容量,是resNet中最小的容量了
resNet不是被设计用来和大量的标准密集层一起使用的,而是和global average pooling层一起使用的。
最初的resnet是在imagenet中训练的,vgg就是卷积-》激活-》卷积。。,resnet就是有relu在上面的卷积层
resNet Block:和vgg的区别,vgg的卷积-》batch normalization-》激活。。+identity部分,最后是merge(x,input_tensor)
resNet优点:(1)可以建立更深层次的网络,在对权重进行反向传播计算时,在identity中进行反向传播时很容易的,不会出现梯度爆炸或者激活值爆炸
t+1时刻的隐藏激活值-t时刻的。。=t时刻resNet block作用于隐藏层的值
--》对残差建模
resnet的结构本质类似boosting,即拥有大量的对误差进行预测的模型
global average pooling:resnet中不需要dropout的原因是使用了~,而使用~使得模型中参数大大减少,NIN 中采用global average pooling ,而不是使用 fc 层,减少了网络参数。例如,假如,最后的一层的数据是10个6*6的特征图,global average pooling是将每一张特征图计算所有像素点的均值,输出一个数据值,
这样10 个特征图就会输出10个数据点,将这些数据点组成一个1*10的向量的话,就成为一个特征向量,就可以送入到softmax的分类中计算了
99%以上的工作都是需要迁移学习的,如果不适用,就意味着你的数据集和别人的大不相同,以至于没有一个模型中的特征是对你有一点帮助的。几乎所有的迁移学习都用vgg,vgg是被设计成来建立逐渐复杂的层的。
data leakage:建立模型和ML中常见,原因是将与目标结果直接相关的特征纳入了数据集,但是那个信息要不无法使用,要不在实际生活中根本不起任何作用。
http://www.mamicode.com/info-detail-1799605.html --- 渔场的那个比赛
---》
微调的意义:因为我们只有数千张训练样本,而深度网络的参数非常多,这就意味着训练图片的数量要远远小于参数搜索的空间,因此,如果只是随机初始化深度网络然后用这数千张图片进行训练,非常容易产生“过拟合”(Overfitting)的现象。为了解决这样的问题,我们一般都会使用那些已经在数百万甚至上千万上训练好的网络参数作为初始化参数,可以想象这样一组参数的网络已经“看过”了大量的图片,因此泛化能力大大提高了,提取出来的视觉特征也更加的鲁棒和有效。
我们将微调的范围扩大至更多的卷积层。不过事实上,我们会认为位置相对靠前的卷积层提取出来的特征更加的底层和具有通用性,而位置相对靠后的卷积层以及全连接层更加与数据集的相关性大一些,因此有时候我们并不会微调前几个卷积层。
技巧1:同一个模型,平均多个测试样例
这个技巧指的是,当我们训练好某个模型后,对于某张测试图片,我们可以使用类似数据扩增的技巧生成与改张图片相类似的多张图片,并把这些图片送进我们训练好的网络中去预测,我们取那些投票数最高的类别为最终的结果。Github仓库中的predict_average_augmentation.py实现的就是这个想法,其效果也非常明显。
技巧2:交叉验证训练多个模型
还记得我们之前说到要把三千多张图片分为训练集和验证集吗?这种划分其实有很多种。一种常见的划分是打乱图片的顺序,把所有的图片平均分为K份,那么我们就可以有K种<训练集,验证集>的组合,即每次取1份作为验证集,剩余的K-1份作为训练集。因此,我们总共可以训练K个模型,那么对于每张测试图片,我们就可以把它送入K个模型中去预测,最后选投票数最高的类别作为预测的最终结果。我们把这种方式成为“K折交叉验证”(K-Fold Cross-Validation)。图9表示的就是一种5折交叉验证的数据划分方式。
-->如果能找出某条鱼来自那条船
--》统计不同大小图片的个数~不同大小的鱼是什么类型 32min
-->比赛的目的是找出神马时候非法捕捞了,或者捕捉了错误的类型的鱼,所以找出那家渔船捕捉的鱼是没有意义的,即data leakage现象
--》如何利用leakage?:merge([x,bn_inp])参数二是图像的大小,且已经对图像的大小进行过独热编码,因为他们现在是被当作类别来利用的;现在这个模型能做的是它最后一层dense layer能够学习将图片特征和元数据结合起来~同样也可以用于协同过滤
官方避免leakage的做法是:类似分层抽样,要求每条船上的鱼的数量和类型都要一致等
--》在每一个项目种,自己都应该思考如何复制没有leakage的现实条件
fisheries比赛的一个输入信息是图像的经过独热编码的大小,把它假设为对船只身份的代理
---》手动给鱼画上“边界盒”
---》去掉包围盒后,我们的loss更加稳定
关心图片输入大小的只有dense layer,因为conv的卷积核大小是不变的,pooling是没有的权重的,batch normalization的只与上一层权重有关
---》构建全卷积神经网络
---》代码修改~我们可以使用不同的大小,如果使用了不同的大小,就不要使用全连接层~当size不为224*224时,删掉最后的dense layer,这样我们可以在任意大小的输入内容上利用这个结构来建立那些卷积特征
---》对输入的size不需要固定,但是对于dense layer,他的权重矩阵是固定的,而且通常权重矩阵的输入就是经过flatten的上一层的卷积层,而它的大小取决于图片的大小;而卷积权重的大小取决于过滤器的大小,而不是图片的大小
---》640*360的图片对应的矩阵是360*640,最后一个2Dconv的输出是(8,5,5),即最终分类数为8
why用cnn代替所有的dense layers?:
(1)实践证明去掉dense layer,使用globalaveragepooling很有效,具有普遍化特征
(2)conv可以帮着我们找到目标位置
在热图上视觉化网络层
---》提高热图的解析度~删除所有的maxpooling(将分辨率的x、y都降低了一半)
---》找有鱼和找没有鱼的图片的热度图相反,一个是蓝色包围着有鱼的位置的红色,一个是红色包围着些蓝色
---》粉红色并不是代表鱼的位置,热图只是告诉我我们的模型目前不是在寻找鱼,而是在寻找船的特性,那么这里存在一定程度的leakage
Inception结构:和reanet的组合,搭建最小的~
---》即拥有不同大小的卷积过滤器,运行所有的过滤器然后连接起来,就是Inception网络所进行的操作
---》如何匹配鱼头和鱼尾 --手动注释
---》手动注释+分离鱼的方法相结合
---》类似resnet中的resnet block,inception网络中有一直重复的inception blcok~不同conv大小~block能够找寻不同范围的内容然后建立一个把这些内容都加起来的一张最后的特征图
---》keras中有resnet\inception网络直接下载和使用
通过识别鱼的类型来找到鱼的位置
scan:使用scan来对每一个序列循环调用函数~theano使用了tree的方式
lesson7cnn architecture-fastai的更多相关文章
- Undefined symbols for architecture arm64解决方案
在iOS开发中经常遇到的一个错误是Undefined symbols for architecture arm64,这个错误表示工程某些地方不支持arm64指令集.那我们应该怎么解决这个问题了?我们不 ...
- Optimal Flexible Architecture(最优灵活架构)
来自:Oracle® Database Installation Guide 12_c_ Release 1 (12.1) for Linux Oracle base目录命名规范: /pm/s/u 例 ...
- EF框架组件详述【Entity Framework Architecture】(EF基础系列篇3)
我们来看看EF的框架设计吧: The following figure shows the overall architecture of the Entity Framework. Let us n ...
- [Architecture] 系统架构正交分解法
[Architecture] 系统架构正交分解法 前言 随着企业成长,支持企业业务的软件,也会越来越庞大与复杂.当系统复杂到一定程度,开发人员会发现很多系统架构的设计细节,很难有条理.有组织的用一张大 ...
- Stack Overflow: The Architecture - 2016 Edition
To get an idea of what all of this stuff “does,” let me start off with an update on the average day ...
- ios build时,Undefined symbols for architecture xxx问题的总结
简单来说,Undefined symbols基本上等于JAVA的ClassNotFoundException,最常见的原因有这几种: build的时候没有加framework 比如说,有一段代码我用了 ...
- Undefined symbols for architecture x86_64: "_OBJC_CLASS_$_The49DayPersonalFullscreenGiftModel", referenced from: objc-class-ref in The49DayPersonalRoomGiftModel.o ld: symbol(s) not found for a
Undefined symbols for architecture x86_64: "_OBJC_CLASS_$_The49DayPersonalFullscreenGiftModel&q ...
- ios开发错误之: Undefined symbols for architecture x86_64
错误如下: Undefined symbols for architecture x86_64: "_OBJC_CLASS_$_RoutingHTTPServer", refere ...
- util-linux编译unknown architecture 'BSD_LABELSECTOR' undeclared错误
------------------------------------------------------------------------------ In :: fdiskbsdlabel.h ...
- 解决duplicate symbols for architecture x86_64错误
duplicate symbols for architecture x86_64 两个不第三方SDK之间的文件里面内容重复了,类似 file.h+file.m 和 CHfile.h+CHfile.m ...
随机推荐
- 把旧系统迁移到.Net Core 2.0 日记(10) -- EF core 和之前版本多对多映射区别
EF Core 现在不支持多对多映射,只能做2个一对多映射. 比如Product和Category 我现在定义Product和Category是多对多关系. 那么实体定义如下: public clas ...
- vue中alert toast confirm loading 公用
import Vue from 'vue' import { ToastPlugin, AlertPlugin, ConfirmPlugin, LoadingPlugin } from 'vux' / ...
- linux下stat命令详解
在linux系统下,使用stat(显示inode信息)命令可以查看一个文件的某些信息,我们先来尝试一下. 简单的介绍一下stat命令显示出来的文件其他信息: - File:显示文件名 - Size: ...
- std::string find 的返回值
std::string 的方法 find,返回值类型是std::string::size_type, 对应的是查找对象在字符串中的位置(从0开始), 如果未查找到,该返回值是一个很大的数据(4294 ...
- Vue + Element UI 实现权限管理系统(国际化实现)
国际化支持 1.安装依赖 执行以下命令,安装 i18n 依赖. yarn add vue-i18n $ yarn add vue-i18n yarn add v1.9.4 warning packag ...
- HTML编辑笔记3
表单 1.语法 <form method="get|post" action="数据向哪提交的地址"> //表单内容 </form> 2 ...
- RabbitMQ Dead Lettering(死信)
死信,顾名思义,就是死掉的消息,死掉的消息是会被一般的队列丢弃的.如果这些消息很重要,而我们又需要,怎么办?凡事都有一个退路,现在就有一种方法可将这些死信消息存下来,那就是DLX(Dead Lette ...
- 继承,C++
body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...
- set的三种遍历方式-----不能用for循环遍历(无序)
set的三种遍历方式,set遍历元素 list 遍历元素 http://blog.csdn.net/sunrainamazing/article/details/71577662 set遍历元素 ht ...
- C++输出数组名
1.如果C++输出的数组是char类型的,那么输出的就是数组中的元素. 2.如果使用的是其他类型的数组作为输出的话,那么就是一个16进制的地址. 3.还是那句话,对数组的操作,很多时候都是指针的操作, ...