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 ... 
随机推荐
- 利用模板导出文件(二)之jacob利用word模板导出word文件(Java2word)
			https://blog.csdn.net/Fishroad/article/details/47951061?locationNum=2&fps=1 先下载jacob.jar包.解压后将ja ... 
- x=x+1, x += 1, x++ 效率分析
			x = x + 1 效率最低 具体如下: 1. 读取右x的地址 2. x + 1 3. 读取左x的地址 4. 将右值传给左边的x(编译器不认为左x和右x是同一个地址) x += 1 其次 1. 读取右 ... 
- 【SQL】group by 及 having
			Group By 分组汇总 HAVING:给分组设置条件 1.概述 “Group By”从字面意义上理解就是根据“By”指定的规则对数据进行分组,所谓的分组就是将一个“数据集”划分成若干个“小区域”, ... 
- select * from dim.dim_area_no@to_dw
			应该是建的有database linksdim是用户名,dim_area_no是表名,to_dw 是建的database links的名,dim_area_no表属于dim用户创建database l ... 
- Vue + Element UI 实现权限管理系统(第三方图标库)
			使用第三方图标库 用过Elment的同鞋都知道,Element UI提供的字体图符少之又少,实在是不够用啊,幸好现在有不少丰富的第三方图标库可用,引入也不会很麻烦. Font Awesome Font ... 
- day05 可变不可变类型
			#可变类型: 值变了,但是id没有变,证明没有生成新的值而是在改变原值,原值是可变类型#不可变类型:值变了,id也跟着变,证明是生成了新的值而不是在改变原值,原值是不可变 # x=10# print( ... 
- js两种打开新窗口
			1.超链接<a href="http://www.jb51.net" title="脚本之家">Welcome</a> 等效于js代码 ... 
- day26-python操作redis二
			字符串的操作 #redis中的string 在内存中都是按照一个key对应一个valus来存储的 import redis pool = redis.ConnectionPool(host=" ... 
- 双引号与尖括号的区别 and 相对路径与绝对路径
			包含头文件的时候,如果包含的是自己写的头文件是用" " .如果是包含系统的头文件,一般用<>. 相对路径与绝对路径 
- String类的常用方法总结
			一.String类String类在java.lang包中,java使用String类创建一个字符串变量,字符串变量属于对象.java把String类声明的final类,不能有类.String类对象创建 ... 
