
1
本节简介
callback
了解callbacks和event handlers的本质
了解Python中应用callbacks的方法,以及优缺点
用callback把cnn放到gpu上
其他基础原理
__ dunder__ :Python中的特殊符号
如何用editor查看源代码
Variance 方差, standard deviation 标准偏差, covariance 协方差, correlation 相关性
Softmax
异常
重点
深入模型,看训练过程中的行为
pytorch hooks,可以方便在Forward和Backward中加入callbacks
追踪Activations在每个layer上的变化
把追踪结果放在图像上,以找出问题
根据问题,修改Activation Function
介绍batchnorm,了解不适用的领域,优缺点
设计一种新的Normalization layer去解决这个问题


提前准备的文件05a_foundations.ipynb
2
Callbacks
回调函数:就是把一个函数当作参数一样传进来在Fast.ai中用的最多的就是以状态(Event)命名的callback函数,这样可以更好的定义此时该做什么事
2.1
基础例子
显示进度的callback:show_progress
更精简的版本,把show_progress写成lambda函数

2.2
callback上加额外参数 lambda & partial
如果要接收cb中的参数,并且额外再加个参数:
改成更直观的

用lambda精简下

inner这种方式有个专用的叫法:closure 闭包
但这一切都可以通过python中的partial方法来实现,这样可读性更高了!


2.3
Class Callback
这是没有状态的版本,只用到了内置的init和call

这是有状态的版本,可以随时打出来状态节点的值
*args 位置参数,存储方式是tuple
**kwargs 关键词参数,存储方式是dictionary

2.4
修改行为的Callback
可以提前判断callback是否存在,以及根据callback的返回结果控制是否中断运行。

3
基础知识
3.1
双下划线的特殊函数
文档:
https://docs.python.org/3/reference/datamodel.html#object.__init__

3.2
查看源代码
Jeremy用的vim,感觉是骨灰级程序员的工具,我这个新手还是用可视化程度比较高的吧,于是选了atom,需要安装如下插件,然后就可以查看引用函数的源代码了。


3.3
Variance 方差, standard deviation 标准偏差
因为计算比较简单,所以用方差的比较多

3.4
covariance 协方差, correlation 相关性


r越大,就表示线性相关性越高

这里有个视频解释的很形象:https://youtu.be/85Ilb-89sjk
3.5
Softmax

虽然2张图的预测结果一样,但很可能第一张图有鱼有房子,而第二张什么都没有,所以它只适用于只有一个目标检测对象的时候。

这时就需要binomial 二项分配,得出来的值可以更客观的反应图片上没有什么;而之所以大家都用softmax,因为imagenet都是只检查一个类别的。
3.6
用Exception来终止一个一段代码
做一个Learning Rate Finder05b_early_stopping.ipynb


关于Exception的文档:
https://docs.python.org/3/library/exceptions.html
自己尝试的例子

4
本节课核心,深入理解训练过程
ConvNet
深入模型,看训练过程中的行为
Hooks
pytorch hooks,可以方便在Forward和Backward中加入callbacks
追踪Activations在每个layer上的变化
把追踪结果放在图像上,以找出问题
根据问题,修改Activation Function
BatchNorm
介绍batchnorm,了解不适用的领域,优缺点
设计一种新的Normalization layer去解决这个问题
4.1
ConvNet
之前用的是linear+ReLu+Linear,把数据从784→50→10现在用卷积神经网络来训练
06_cuda_cnn_hooks_init.ipynb




CUDA
上面的训练太慢,用callback放到GPU上,CUDA是NVIDIA的一项并行处理数据的技术


快了3倍的速度
重构
只是把重复的代码更抽象一点了,但易读性反而变差所以其他的就不看了,就把这个transform的callback拿出来看看吧

4.2
Hooks
这里通过hook可以更方便的统计出指标,发现问题后
用Normalization初始化数据;
用Relu的配置,让Activation分布更有意义
原始版本


可以看到这里有明显的大起大落,而且标准差的值一开始并不是接近于1

对每个层进行Normalization后,std更接近1了


Pytorch Hook Function
只要在每个层上都注册一个hook就可以,每次Forward后算出了output,就会触发hook

Pytorch Hook Class重构
要及时删除hooks

把Hooks Class增加类似于Array的属性
这里不展开,都是比较基础的东西,可自行查看视频或文档
更多指标:histogram 直方图/柱状图
如下显示的是前4个layers,每个batch的Activations的值分布
期中黄色部分就是分布最多,说明大部分值都接近于0,用下图展示出来80-90%的都是接近于0

通用的Relu
为了解决上面遇到的问题


对Relu的改造后,分布更均匀了,而且接近0的Activations占比只有20%

4.3
Batchnorm
介绍batchnorm,了解不适用的领域,优缺点
设计一种新的Normalization layer去解决这个问题
从零搭建
07_batchnorm.ipynb

如下解释了x.mean的运作方式

于是乎这一轮对batchnorm的处理,就把feature的因素给消除了,下一轮处理的数据就可以更突显其他因素。
线性插值,为了计算均值消耗更小的性能,类似于Momentum

调用Pytorch BatchNorm的方式

More norms
普通的BatchNorm不适用于边训练边运行的项目,以及RNN和小batch
LayerNorm和BatchNorm的唯一区别就是,求的均值是每个image的,而不是每个channel的

InstanceNorm求的均值是每个image的每个channel

所以二者都不适合当前的模型训练,LayerNorm更适合RNN,InstanceNorm更适合Style Transfer

Fix small batch size problem
解决批次太小,训练时间会很长,而且准确率会特别低,所以需要通过epsilon来解决,但需要很慎重的调节eps

所以做了Running BatchNorm来解决BatchNorm批次太小的问题
用更高效率的算法来计算variance
求count
Debiasing这个技术可以用最小的epoch实现最高的准确率,1epoch 98%的准确率,还没发布,是个好东西

相关阅读
产品经理也能动手实践的AI:
(一)|(二)|(三)|(四)|(五)|(六)|(七)|(八)
人人都能搞懂的AI :

如果你喜欢思考,又喜欢学点新东西,别忘记关注+置顶公众号哦!
我是Hawk,8年产品经理,目前专注AI机器学习。

本文深入探讨深度学习模型的训练过程,介绍PyTorch Hooks的概念,如何利用Hooks在前向传播和反向传播中插入回调函数以追踪激活值,通过调整Activation Function和使用Normalization改进模型性能。同时,文章讲解了BatchNorm的原理、优缺点及解决小批量问题的策略。
22万+

被折叠的 条评论
为什么被折叠?



