训练loss不下降原因集合

转载自:https://blog.csdn.net/jacke121/article/details/79874555

一,train loss与test loss结果分析

  • 4666

train loss 不断下降,test loss不断下降,说明网络仍在学习;

train loss 不断下降,test loss趋于不变,说明网络过拟合;

train loss 趋于不变,test loss不断下降,说明数据集100%有问题;

train loss 趋于不变,test loss趋于不变,说明学习遇到瓶颈,需要减小学习率或批量数目;

train loss 不断上升,test loss不断上升,说明网络结构设计不当,训练超参数设置不当,数据集经过清洗等问题。

二,

这个比较长,比较完整 Loss和神经网络训练

https://blog.csdn.net/u011534057/article/details/51452564

有1.梯度检验2.训练前检查,3.训练中监控4.首层可视化5.模型融合和优化等等等

三,https://www.zhihu.com/question/38937343

四,https://blog.csdn.net/u010911921/article/details/71079367

原文地址:http://blog.csdn.net/u010911921/article/details/71079367 
这段在使用caffe的时候遇到了两个问题都是在训练的过程中loss基本保持常数值,特此记录一下。

1.loss等于87.33不变

loss等于87.33这个问题是在对Inception-V3网络不管是fine-tuning还是train的时候遇到的,无论网络迭代多少次,网络的loss一直保持恒定。

查阅相关资料以后发现是由于loss的最大值由FLT_MIN计算得到,FLT_MIN是其对应的自然对数正好是-87.3356,这也就对应上了loss保持87.3356了。

这说明softmax在计算的过程中得到了概率值出现了零,由于softmax是用指数函数计算的,指数函数的值都是大于0的,所以应该是计算过程中出现了float溢出的异常,也就是出现了inf,nan等异常值导致softmax输出为0.

当softmax之前的feature值过大时,由于softmax先求指数,会超出float的数据范围,成为inf。inf与其他任何数值的和都是inf,softmax在做除法时任何正常范围的数值除以inf都会变成0.然后求loss就出现了87.3356的情况。

解决办法

由于softmax输入的feature由两部分计算得到:一部分是输入数据,另一部分是各层的权值等组成

  1. 减小初始化权重,以使得softmax的输入feature处于一个比较小的范围

  2. 降低学习率,这样可以减小权重的波动范围

  3. 如果有BN(batch normalization)层,finetune时最好不要冻结BN的参数,否则数据分布不一致时很容易使输出值变得很大(注意将batch_norm_param中的use_global_stats设置为false )。

  4. 观察数据中是否有异常样本或异常label导致数据读取异常

    <p>本文遇到的情况采用降低学习率的方法,learning rate设置为0.01或者原来loss的或者。</p>
    </li>
    

2.loss保持0.69左右

采用VGG-16在做一个二分类问题,所以计算loss时等价与下面的公式:

 

当p=0.5时,loss正好为0.693147,也就是训练过程中,无论如何调节网络都不收敛。最初的网络配置文件卷积层的参数如下所示:

从VGG-16训练好的模型进行fine-tuning也不发生改变,当在网络中加入初始化参数和decay_mult以后再次训练网络开始收敛。


但是具体是什么原因造成的,暂时还没有找到,难道是初始化参数的问题还是?

参考资料

http://blog.csdn.net/jkfdqjjy/article/details/52268565?locationNum=14

https://groups.google.com/forum/#!topic/caffe-users/KEgrRlwXz9c

 

https://www.zhihu.com/question/68603783

 

loss一直不下降的原因有很多,可以从头到尾滤一遍: 1)数据的输入是否正常,data和label是否一致。 2)网络架构的选择,一般是越深越好,也分数据集。 并且用不用在大数据集上pre-train的参数也很重要的 3)loss 对不对。

具体到语音,很多是把audio转成频谱图送给CNN训练。

NIPS16 有个soundNet(torch的code),语音分类的performance很高,我觉得可以用来初始化你的model 参数, 可以参考下。

还有我见的3D-CNN 多用于视频,做audio 用3D 的工作比较少,倒是见过是用1维卷积做audio的

 

PyTorch是一种流行的深度学习框架之一,它提供了丰富的工具和函数,使开发人员可以快速、高效地构建神经网络模型和训练代码。在PyTorch中,损失、优化器和参数之间存在着密切的关系,其中损失和优化器是训练神经网络模型的关键组成部分,而参数则是模型权重的集合。 损失函数是神经网络训练过程中非常关键的一部分,用于衡量模型输出与期望输出之间的差异,在模型训练期间不断减小以提高模型性能。在PyTorch中,常用的损失函数包括交叉熵、均方误差、负对数似然以及Kullback-Leibler散度等。它们都是可微分的函数,可以作为反向传播算法的基础,计算出模型权重中的梯度。 优化器是优化模型权重的算法,它的目标是最小化损失函数,并且在模型训练过程中不断调整模型权重。PyTorch提供了多种优化器,包括随机梯度下降、Adam、Adagrad等,每种优化器在不同类型的数据集和任务中表现都不同。优化器的选择通常基于数据集的大小、模型的结构、训练目标和可用硬件等因素。 参数是神经网络模型中的可训练变量,它们用于捕捉输入与输出之间的关系,从而提高模型的性能。每个参数都被初始化为随机值,并根据训练数据进行更新以最小化损失函数。在PyTorch中,参数通常包含在神经网络模型的层中,每个层都有自己的权重和偏差参数。 在PyTorch中,损失、优化器和参数之间的关系可以描述为一个迭代的过程,即在每次迭代中,优化器根据损失函数计算出参数的梯度,并通过随机梯度下降等算法更新参数值,直到损失函数足够小或达到预定的迭代次数为止。通过优化这些参数,模型可以逐步提升性能,从而实现更好的学习效果。 总之,在PyTorch中,损失、优化器和参数之间存在着密切的关系,它们共同构成了深度学习模型训练的核心部分。通过选择合适的损失函数和优化器,并对参数进行适当的初始化和调整,开发人员可以构建更加准确、高效的神经网络模型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值