模型不收敛

很多同学会发现,为什么我训练网络的时候loss一直居高不下或者准确度时高时低,震荡趋势,一会到11,一会又0.1,不收敛。 又不知如何解决,博主总结了自己训练经验和看到的一些方法。

首先你要保证训练的次数够多,不要以为一百两百次就会一直loss下降或者准确率一直提高,会有一点震荡的。只要总体收敛就行。若训练次数够多(一般上千次,上万次,或者几十个epoch)没收敛,则试试下面方法:

1. 数据和标签

数据分类标注是否准确?数据是否干净?数据库太小一般不会带来不收敛的问题,只要你一直在train总会收敛(rp问题跑飞了不算)。反而不收敛一般是由于样本的信息量太大导致网络不足以fit住整个样本空间。样本少只可能带来过拟合的问题

2. 学习率设定不合理

在自己训练新网络时,可以从0.1开始尝试,如果loss不下降的意思,那就降低,除以10,用0.01尝试,一般来说0.01会收敛,不行的话就用0.001. 学习率设置过大,很容易震荡。不过刚刚开始不建议把学习率设置过小,尤其是在训练的开始阶段。在开始阶段我们不能把学习率设置的太低否则loss不会收敛。我的做法是逐渐尝试,从0.1,0.08,0.06,0.05 ......逐渐减小直到正常为止,

有的时候候学习率太低走不出低估,把冲量提高也是一种方法,适当提高mini-batch值,使其波动不大。,

 3.网络设定不合理

如果做很复杂的分类任务,却只用了很浅的网络,可能会导致训练难以收敛,换网络换网络换网络,重要的事情说三遍,或者也可以尝试加深当前网络。

4.数据集label的设置

检查lable是否有错,有的时候图像类别的label设置成1,2,3正确设置应该为0,1,2。

5、改变图片大小

博主看到一篇文章,说改变图片大小可以解决收敛问题,具体博主没试过,只看到有这个方法,具体文章链接:https://blog.youkuaiyun.com/Fighting_Dreamer/article/details/71498256

感兴趣的可以去看看。

6、数据归一化

神经网络中对数据进行归一化是不可忽略的步骤,网络能不能正常工作,还得看你有没有做归一化,一般来讲,归一化就是减去数据平均值除以标准差,通常是针对每个输入和输出特征进行归一化

 

不收敛描述及可能原因分析
不收敛情景1
描述
从训练开始就一直震荡或者发散
可能原因
图片质量极差,人眼几乎无法识别其中想要识别的特征,对于网络来说相当于输入的一直都是噪音数据,比如通过resize的时候,图片的长宽比改变特别大,使图片丧失对应特征;或者tfrecord中图片大小是(m,n),但是读取的时候,按照(n,m)读取。所以loss一直震荡无法收敛
大部分标签都是对应错误的标签
leaning rate 设置过大
不收敛情景2
描述
训练开始会有所下降,然后出现发散
可能原因
数据标签中有错误,甚至所有标签都有一定的错误,比如生成的标签文件格式和读取标签时设置的文件格式不一样,导致读取的标签是乱码;或者为标签中存在的空格未分配对应的编码,导致读取的空格为乱码(在OCR问题中)
learning rate 设置过大
不收敛情景3
描述
训练开始会有所下降,然后出现震荡
可能原因
loss函数中正则化系数设置有问题,或者loss函数本身有问题。比如,在序列化问题中的label_smoothing设置过大,比如设置为0.9,一般设置为0.1即可(OCR问题中)
数据标签中有错误,甚至所有标签都有一定的错误

虽然给定的引用未涉及starccm中sst模型收敛的解决方案,但可从一般性的CFD仿真收敛解决思路进行分析: - **网格质量方面**:确网格质量良好,对复杂区域进行局部网格加密细化。在STAR - CCM+里,可利用其网格修复功能,将部分水平体和表面与适当的物理、体网格和边界条件相关联,障网格符合数值模拟基础要求。同时,使用部件转换或布尔操作等基于部件的操作来优化网格结构,这有助于改善流场的模拟效果,进而提升收敛性 [^1]。 ```python # 此处仅为示意代码,并非实际STAR - CCM+代码 # 假设这是一个伪代码用于描述网格加密操作 def refine_mesh(region): if region.is_complex(): region.refine() ``` - **边界条件设置方面**:检查边界条件设置是否合理,确进出口边界、壁面边界等参数准确无误。在运行协同仿真前,分别运行流体模型和固定模型的单独案例,确定模型各自收敛,避免因边界条件设置当导致收敛。如在特定案例中,对Abaqus模型施加于平板表面的压力负载*DSLOAD采用估计的恒定压力值单独运行,以确模型收敛性 [^2]。 ```python # 假设这是一个伪代码用于检查边界条件 def check_boundary_conditions(model): for boundary in model.boundaries: if boundary.is_inlet(): if boundary.velocity < 0: print("Inlet velocity is invalid") elif boundary.is_wall(): if boundary.friction_coefficient < 0: print("Wall friction coefficient is invalid") ``` - **求解器参数方面**:适当调整求解器的参数,如松弛因子等。可先采用较小的松弛因子使求解过程更稳定,之后再逐步增大以加快收敛速度。 ```python # 假设这是一个伪代码用于调整松弛因子 def adjust_relaxation_factor(solver, initial_factor, step): current_factor = initial_factor while not solver.is_converged(): solver.relaxation_factor = current_factor solver.solve() current_factor += step ``` - **物理模型方面**:核实SST模型的相关参数设置是否合适,确湍流模型与实际问题相匹配。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值