问题:Loss/Accuracy不变

今天下午跑实验2,手写的回归算法。反复检查Code没有问题,但是Loss从epoch2开始一直不变(如图)。是什么原因呢?
Epoch2开始,测试集和训练集的loss一直不变

网上方案

经过手动排查,网上列出的原因主要有以下三种,测试了均没有效果。

学习率太大、太小

根据指数搜索策略,手动更改学习率为0.1、0.01、0.001后,loss依旧不变。

y y y y ^ \hat{y} y^不在同一维度,发生了广播

for X, Y in train_iter:
    # the predication
    Yhat = net(X)
    # ensure y^ and y in same size
    print("Yhat",yhat.size())
    print("Y",Y.size())

手动检查,发现维数完全正确。

最后一层添加了激活函数

去除激活函数。发现仍然没有改变。

训练过程中存在命名错误

例如:dataloader命名为y,和训练过程中的y命名重复

最终解决:数据集的virance不够大(太简单了)

手动打印了梯度,发现从epoch2开始gradient矩阵为零。
最终发现原因:

  • 数据集中向量的方差太小。
  • 使用性质较好的Relu作为激活函数。
  • 使用网络层数较多,特征学习充分
  • 最终使得模型在数据集上一次收敛。

更改如下:

  • 让向量均匀分布。
  • 使用性质没有那么优良的Sigmoid作为激活函数。
  • 减少隐藏层个数 Debug时可以直接使用线性模型进行debug
  • 出现了数值不稳定错误 例如:Softmax和交叉熵分别定义可能会导致溢出
    结果:
    在这里插入图片描述
    各位亲可以试一下以上方法,如果成功了,记得点个赞哦~ 也欢迎补充其它可能的原因。
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐