(四)fastai 2019 lesson11 Data Block API, genericoptimizer lesson12 Advanced training techniques

lesson11 Data Block API, genericoptimizer


 1. LSUV 另一种初始化技术:逐层序列化单位方差

  • 这种初始化的好处:可以不假思索的初始化任何神经网络,不用考虑是否有ReLU或者dropout。我们可以很轻松的对复杂和特别深层的网络架构训练。这是fastai初始化你的神经网络的方法,这不是数学,不需要思考,只需要一直while循环。

2. DataBlock API 

(一)fastai1.0.61库 debug & datablock API 数据接口__helen_520的博客-CSDN博客_fastai库 中针对DataBlock已经有过介绍了。

3. 新的CNN模型

5个epoch训练后,imagenette的valid_acc=73.6%,官网上显示为85% best。还可以再进一步优化。

 4. Optimizer 优化

Optimizer初始化 

 5. Weight decay 权重衰减

与l2正则化相关:KCF原理学习__helen_520的博客-CSDN博客

  • 挑选数据的PCA的成分最终的方向。自动地进行了模型选择。
  • weight decay与l2正则化的区别如下:

 

 在先做momentum,在做weight decay,会一直多加入一个衰减因子的污染。这个是需要注意的。

 

  Weight decay + Batch Norm的效果:批量归一化+权重衰减

Momentum动量的工作机制

 

 

 

6. Data Augumentation 数据增强

rgb、resize、byte_tensor、float_tensor。

bilinear会丢失纹理。img.resize((), resamplt=PIL.Image.BILINEAR) 

  • Reisize method:ANTIALIAS、BILINEAR、NEAREST、BICUBIC

  •  Flippling, rotate, cropping

 透视变换

透视变换的计算公式的网站:https://web.archive.org/web/20150222120106/xenia.media.mit.edu/~cwren/interpolator/

 

 

 

 批量做数据增强:Batch data augmentation

在GPU上对图像进行任意的仿射变换,如旋转、缩放、移位、变形等。pytorch可以实现。

 

 

7. mixup && labeling smooth 标签平滑

10b_mixup_label_smoothing.ipynb 

mixup数据增强技术可显著改善结果。特别是当数据较少时,可以让网络训练更长时间。

① 在一个dataloader中,速度快;

② 使用max(t, 1-t)可以避免重复

③ loss上面进行修改

 

 使用reduction,是因为pytorch的nn.crossEntropy函数中有一个reduction属性,来指定是计算单个损失,还是计算整个batch的损失(mean or sum)。

这里希望先进行线性计算,再进行batch求和。所以在计算线性计算的时候,要关闭reduction。即,loss1和loss2计算的时候要NoneReduce,就将reduction的属性设置为none了。并将原来的reduction状态保存在self.old中。

然后整个batch的reduction再使用reduction的mean属性来完成。

 

mixup有利于训练更稳定:可以认为,样本的mixup加入了更多的背景因素。使得训练更加鲁棒。右边比较早的开始过拟合了。 

 

网络架构如下:

model的网络结构如下:

 featuremap经过每一层的情况:(之前有一个模型参数量计算的)

model_summary在nb_08.py中

 Label Smooth 标签平滑——经常用于分类的正则化技术

  • 这是处理数据中标签的噪声的一种非常简单,但非常有效的办法。标签中可能会存在噪声。
  • 即使数据中有50%的标签都是错的,这样训练出的结果依然可以很鲁棒。
  • 在花费大量时间清理数据之前,我们依然可以较快的进行训练,从而来检测一些手段是否有效。
  • 什么是label smooth?——故意为标签引入噪声。通过改变target的标签,使得模型的决策不是100% asure,而是带有一定概率。

效果对比: 

 

 lesson12 Advanced training techniques 

Trainging in mixed precision 混合精度训练

10c_fp16.ipynb

  • FP32,小数位精度6~7位。
  • FP16,小数位精度4~5位。
  • 所以在权重更新过程中:w=w-lr*grad,其中grad可能就是很小。因为activations们遵循N(0,1),其梯度值就更小了。所以很可能出现权重的梯度是值很小的值,在FP16时就会被四舍五入掉。导致精度下降。
  • grad可能下溢,FP16如果梯度下溢,那么grad就变成了0。
    • 同时在FP16中,也更可能上溢,变成nan。训练更容易发散,不收敛了。
  • 怎么办呢?——混合精度训练。在前向传播和传播的过程中使用FP32.
    • ① 权重更新不精确,grad下溢
    • ② grad下溢——乘以一个比例因子,scale,进行放大。
    • ③ 激活元或者Loss溢出;上溢出nan,或者下溢出。——Nvidia是将batchnorm层保留为单精度FP32,BN层没有多少权重,所以内存不会占多少,并计算FP32的损失。 

 

 

 

 

 

 

 

 XResNet

XResNet ,它是 ResNet 的突变 / 扩展版本。这是从 技巧袋论文中 提取的经过调整的 ResNet

所以,一开始不做7×7的大卷积核。

ResNetC的第一个修改:1层7×7改为3个3×3,同时有加法的网络。 

 关于BatchNorm的初始化的技巧:

 为什么要使用1×1卷积?

 

 

 resnet34的网络构成如下图所示:

迁移学习 Transform learning和微调fine tune

 

  • ① learn.model到底保留了哪些parameters的值,这些都是训练得到的权重值。

使用的网络时xResNet18。BN对训练的影响是很大的,能够使训练更加的稳定,参考右侧文章的《第6节 BatchNormalization 小批量归一化 》(三)fastai 2019 lesson10 Wrapping up our CNN 重构CNN__helen_520的博客-CSDN博客

  • ② 看各个权重的size

参考教程:【PyTorch】state_dict详解_颜丑文良777的博客-CSDN博客_.state_dict

#encoding:utf-8
 
import torch
import torch.nn as nn
import torch.optim as optim
import torchvision
import numpy as mp
import matplotlib.pyplot as plt
import torch.nn.functional as F
 
#define model
class TheModelClass(nn.Module):
    def __init__(self):
        super(TheModelClass,self).__init__()
        self.conv1=nn.Conv2d(3,6,5)
        self.pool=nn.MaxPool2d(2,2)
        self.conv2=nn.Conv2d(6,16,5)
        self.fc1=nn.Linear(16*5*5,120)
        self.fc2=nn.Linear(120,84)
        self.fc3=nn.Linear(84,10)
 
    def forward(self,x):
        x=self.pool(F.relu(self.conv1(x)))
        x=self.pool(F.relu(self.conv2(x)))
        x=x.view(-1,16*5*5)
        x=F.relu(self.fc1(x))
        x=F.relu(self.fc2(x))
        x=self.fc3(x)
        return x
 
def main():
    # Initialize model
    model = TheModelClass()
 
    #Initialize optimizer
    optimizer=optim.SGD(model.parameters(),lr=0.001,momentum=0.9)
 
    #print model's state_dict
    print('Model.state_dict:')
    for param_tensor in model.state_dict():
        #打印 key value字典
        print(param_tensor,'\t',model.state_dict()[param_tensor].size())
 
    #print optimizer's state_dict
    print('Optimizer,s state_dict:')
    for var_name in optimizer.state_dict():
        print(var_name,'\t',optimizer.state_dict()[var_name])
 
 
 
if __name__=='__main__':
    main()
 

 

 

 

Pascal VOC 2007 目标检测 RetinaNet

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值