lesson7cnn architecture-fastai

时间:2023-03-10 06:31:55
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的方式