alexnet实验偶遇:loss nan, train acc 0.100, test acc 0.100情况,通过bn层加快收敛速度,防止过拟合,防止梯度消失、爆炸
场景:数据集:官方的fashionminst
+ 网络:alexnet
+pytroch
+relu激活函数
源代码:https://zh-v2.d2l.ai/chapter_convolutional-modern/alexnet.html
知识点:梯度爆炸,梯度弥散
学习文献(向大佬看齐)有:
https://zh-v2.d2l.ai/chapter_multilayer-perceptrons/numerical-stability-and-init.html
https://www.bilibili.com/video/BV1X44y1r77r?spm_id_from=333.999.0.0&vd_source=d49d528422c02c473340ce042b8c8237
https://zh-v2.d2l.ai/chapter_convolutional-modern/alexnet.html
https://www.bilibili.com/video/BV1u64y1i75a?p=2&vd_source=d49d528422c02c473340ce042b8c8237
实验现象:
现象一
:
1、代码一开始运行就出现以下情况
现象二
:
2、我尝试把学习率调小之后,中途出现loss nan
现象三
:
群友a:有时候跑没什么问题,网络也没改什么,有时候出现loss nan,有时候不出现
群友b:可能原因:随机初始化变量值的影响
群友a:尝试解决办法:换了随机种子,出现的轮次只是变后了
我的最短路径解决办法:加入BN层
(吃的到老鼠的就是好猫,hhh)
https://zh-v2.d2l.ai/chapter_convolutional-modern/batch-norm.html
def batch_norm(X, gamma, beta, moving_mean, moving_var, eps, momentum):# 通过is_grad_enabled来判断当前模式是训练模式还是预测模式if not torch.is_grad_enabled():# 如果是在预测模式下,直接使用传入的移动平均所得的均值和方差X_hat = (X - moving_mean) / torch.sqrt(moving_var + eps)else:assert len(X.shape) in (2, 4)if len(X.shape) == 2:# 使用全连接层的情况,计算特征维上的均值和方差mean = X.mean(dim=0)var = ((X - mean) ** 2).mean(dim=0)else:# 使用二维卷积层的情况,计算通道维上(axis=1)的均值和方差。# 这里我们需要保持X的形状以便后面可以做广播运算mean = X.mean(dim=(0, 2, 3), keepdim=True)var = ((X - mean) ** 2).mean(dim=(0, 2, 3), keepdim=True)# 训练模式下,用当前的均值和方差做标准化X_hat = (X - mean) / torch.sqrt(var + eps)# 更新移动平均的均值和方差moving_mean = momentum * moving_mean + (1.0 - momentum) * meanmoving_var = momentum * moving_var + (1.0 - momentum) * varY = gamma * X_hat + beta # 缩放和移位return Y, moving_mean.data, moving_var.dataclass BatchNorm(nn.Module):# num_features:完全连接层的输出数量或卷积层的输出通道数。# num_dims:2表示完全连接层,4表示卷积层def __init__(self, num_features, num_dims):super().__init__()if num_dims == 2:shape = (1, num_features)else:shape = (1, num_features, 1, 1)# 参与求梯度和迭代的拉伸和偏移参数,分别初始化成1和0self.gamma = nn.Parameter(torch.ones(shape))self.beta = nn.Parameter(torch.zeros(shape))# 非模型参数的变量初始化为0和1self.moving_mean = torch.zeros(shape)self.moving_var = torch.ones(shape)def forward(self, X):# 如果X不在内存上,将moving_mean和moving_var# 复制到X所在显存上if self.moving_mean.device != X.device:self.moving_mean = self.moving_mean.to(X.device)self.moving_var = self.moving_var.to(X.device)# 保存更新过的moving_mean和moving_varY, self.moving_mean, self.moving_var = batch_norm(X, self.gamma, self.beta, self.moving_mean,self.moving_var, eps=1e-5, momentum=0.9)return Y
csdn的其他解决办法
:
原理一
:
https://www.bilibili.com/video/BV1u64y1i75a?p=2&vd_source=d49d528422c02c473340ce042b8c8237
1、梯度求导+链式法则
1.1、relu激活函数求导性质+梯度爆炸
1、relu的激活函数的导数1或0
2、梯度爆炸
:由于导数的链式法则,连续多层大于1的梯度相乘
会使梯度越来越大,最终导致梯度太大的问题。
3、梯度爆炸 会使得某层的参数w过大
,造成网络不稳定,极端情况下,数据乘以一个大w发生溢出,得到NAN值。
1.2、梯度爆炸的问题:
2.1、sigmoid 激活函数求导性质+梯度消失
![](/assets/blank.gif)
1、由于导数的链式法则,在连续的层中,将小于1的梯度相乘
会使梯度越来越小,最终在一层中梯度为0。
2.2、梯度消失的问题:
实验现象分析:
1、relu激活函数
2、调整学习率可以使得网络中途输出nan
------》
结论:
梯度爆炸
原理二
:
https://www.bilibili.com/video/BV1X44y1r77r?spm_id_from=333.999.0.0&vd_source=d49d528422c02c473340ce042b8c8237
1、alexnet相对是比较深的网络:
2、批量归一化中抽取的是“小批量”
,带有一定的随机性
。一定程度上,这里的小批量会 给网络 带来一定的噪音
来控制模型复杂度
。![](/assets/blank.gif)
3、批量归一化后,lr学习率可以设置大的数,具有加速收敛
的作用
非常感谢李沐大佬的讲解视频!!!!,本文以一个实际的问题出发,了解大佬讲解的知识点。有自己的独特之处
,如有侵权、雷同、错误之处!!,请君指点!!!!!
alexnet实验偶遇:loss nan, train acc 0.100, test acc 0.100情况,通过bn层加快收敛速度,防止过拟合,防止梯度消失、爆炸相关推荐
- loss=nan解决办法
训练网络时出现loss=nan的情况,caffe不会报错,但是显然这样是不对的. 将solver.prototxt文件中的base_lr减小一点之后,这个问题就不再出现了.我一般先将base_lr降为 ...
- 训练中Loss为Nan的原因,梯度消失或者爆炸的优化
向AI转型的程序员都关注了这个号???????????? 机器学习AI算法工程 公众号:datayx 现象 如何确定是否出现梯度爆炸? 在训练过程中出现梯度爆炸会伴随一些细微的信号,如: (1)模 ...
- 【解决方案】pytorch中loss变成了nan | 神经网络输出nan | MSE 梯度爆炸/梯度消失
loss_func = nn.MSELoss() loss = loss_func(val, target) 最近在跑一个项目,计算loss时用了很普通的MSE,在训练了10到300个batch时,会 ...
- 目标检测--RFBNet训练自己制作数据集出现loss=nan问题的解决方法
之前用RFBNet进行目标检测,采用的数据集是VOC2007和VOC2012.最近用在自己的数据集进行训练,由于我的数据集格式跟VOC格式不一样,根据网上的经验,我就开始将自己的数据集制作成VOC格式 ...
- pytorch训练 loss=inf或者训练过程中loss=Nan
造成 loss=inf的原因之一:data underflow 最近在测试Giou的测试效果,在mobilenetssd上面测试Giou loss相对smoothl1的效果: 改完后训练出现loss= ...
- tensorflow object_detection api ERROR:tensorflow:Model diverged with loss = NaN.
进行迁移学习时,使用model_main.py进行训练,无脑报错#"ERROR:tensorflow:Model diverged with loss = NaN.".后来上git ...
- tensorflow loss nan 解决办法
tensorflow loss: nan 解决办法 数据归一化 from sklearn.preprocessing import MinMaxScaler,MaxAbsScaler,Standard ...
- java.lang.NumberFormatException: Infinite or NaN原因之浮点类型除数为0
java.lang.NumberFormatException: Infinite or NaN原因之浮点类型除数为0 啊啊啊啊啊啊啊啊啊啊,看来用不到的东西你永远不知道在代码中会遇到什么奇葩问题.
- 如何解决loss NAN的问题
如何解决loss NAN的问题 参考文章: (1)如何解决loss NAN的问题 (2)https://www.cnblogs.com/zymei/p/10686408.html (3)https:/ ...
最新文章
- Java克隆(Clone)的应用
- C# - 委托中的逆变
- zoj-4011(动态规划)
- qtimer不触发原因_迷你世界:触发器玩法多,教你摆表情就能拥有满格血量
- Day 21 20190205 老男孩python学习第21天 内容整理
- eclipse 创建 maven web 项目教程
- 进击的职场人 健康观念不容轻视——2021职场人健康状况调查报告
- cocos2d-基本概念(4)-CallFunc Action
- 获取当前日期是本年的第几周java与mysql获取值不一致
- 29.yii2 RBAC
- USB 公,母头接口
- excel游戏_Excel集中游戏
- 二乘二(二阶)魔方教程,看完教程拼不出来我给你钱!
- Python编曲实践(九):如何计算并估计音乐的调性(大/小调+主音)?Krumhansl-Schmuckler调性分析算法的原理与实现
- 云安全,到底是怎么一回事?
- 网络爬虫排除协议robots.txt介绍及写法详解.
- 苹果WatchKit轻松入门
- axure RP文件如何找回_u盘文件丢失怎么办 u盘文件丢失恢复方法【步骤详解】
- ps人物磨皮美容插件:Pro Retouch Panel(支持ps2021)
- 古琴入门基础知识【古琴打谱的方法一】——唐畅古琴