深度学习模型训练之炼丹心得

最近炼丹,网络往往什么都学不到= =,不仅怀疑,看到一份英文的炼丹指南,记录一些心得。

英文链接:37 Reasons why your Neural Network is not working

紧急手段

  1. 使用已知适用于此类数据的简单模型(例如,VGG用于图像)。 如果可以,使用标准损失。

  2. 停掉所有的花里胡哨,例如 正则化和数据增强。

  3. 如果是微调模型,请仔细检查数据预处理,确保它与原始模型的训练格式相同。

  4. 验证输入数据是否正确。

  5. 从一个非常小的数据集开始(2-20个样本),在其上过拟合, 再在它上面逐渐添加更多数据。

  6. 开始逐步添加所有省略的部分:数据增强/正则化,自定义损失函数,尝试更复杂的模型。


数据集的问题

检查你的输入

确认你输入的数据符合情理,最好输出一个batch的tensor,确认你的输入是可靠的。

尝试随机输出

输入随机的数据,如果出现同样的错误,说明你的网络,将数据转换为垃圾数据,你需要一步步排查那一层出现了问题

数据加载

你的数据肯是好的,但是你将其传给输入的代码,可能是坏的,所以打印出第一层的输入来检查它

确认输入与groundtruth是对应的

如果只有一部分结果是对的,则有可能输入与真实值不对应。请确保输入与真图打乱之后是对应的。

输入输出是否有关系

输入得到输出的关系是否强烈,当然这和数据集有关系。

数据集是否有太多噪声

打乱数据集

按顺序的数据集会影响学习,请打乱数据集。

降低类别的不平衡性

1000张a类,与一张b类,全部预测a就能得到很高的性能,但不符合我们的期望,所以要平衡类别。

训练集是否足够

如果是从头训练,需要大量的数据。如果是分类,那么经验来说,每一类至少需要1000张图。

确保每一个batch的label不一致

按顺序的数据集可能出现这种情况,所以,shuffle数据集吧,

减小batch size

过于庞大的batch size会降低网络的泛化能力(一般的bs不用考虑这个啦= =)

使用标准数据集

当测试一个新的网络结构或新的代码,使用标准数据集,确保问题是有解的。


数据标准化与数据增强

特征标准化

你是否标准化你的输入至均值为0,方差为1

你是否过度数据增强了

数据增强具有规范化的效果(降低过拟合),太多的数据增强会造成欠拟合

检查预训练网络的预处理

如果使用预训练的网络,确保你训练时使用相同的标准化和预处理。例如图片是【0,1】【-1,1】【0,255】那种格式

检查数据集的预处理

预处理只能根据训练集得到= =,不能带上验证机和测试集


炼丹部分

尝试解决简化版的问题

这会帮助你找到问题所在

找到随机输入是的loss值

然后增强能够降低loss 的正则化等方法

检查你的loss

如果使用自己的loss函数,检查它以确保没有bug。如果有问题,这会很隐晦的影响网络

验证loss函数的输入

调整loss 的权重

如果loss有好几部分,调整各部分之间的权重。例如正相关与负相关,确保是最小化loss函数

监控其他指标

有时候loss不是最佳指标,你可以监控其他指标,例如accuracy

测试任意的网络层

测试你的层,确保他们如预期那样工作

检查是否禁用了某些层

检查您是否无意中禁用了一些应该可以学习的图层/变量的梯度更新。

增加网络的规模

或与你的网络表达能力不够,需要增加参数量与深度

检查隐藏层的维度

梯度检查


训练部分

先在小数据集上解决问题

在小数据集上过拟合确保网络能工作

检查权重的初始化

如果不知道用啥,使用Xavier或者He初始化。当然也可以试试其他的权重初始化方法

改变你的超参数

使用网格搜索,改变你的超参数

减少正则化

过多的正则化会使网络欠拟合。最好首先过拟合,然后正则化以解决过拟合问题。

多练一会

或与你的网络需要更多时间去训练。如果loss还在稳定下降,尝试训练更多时间。

训练模式与测试模式的区别

例如droupout在训练与测试时候的区别

可视化训练过程

检测激活函数,权重的更新,使用tensorboard以监控。权重和偏置的直方图应该大约为高斯分布。

尝试不同的优化器

梯度爆炸与消失

检查网络层的更新,如果有非常大的值说明,梯度爆炸,可以采用梯度剪裁。

激活函数的导数一般在0.5-2.0,如果超出,说明存在梯度爆炸和梯度消失

增加或者降低学习率

学习率低学的慢。学习率高开始可能学得快,但很难找到好的解法。一般实在目前学习率上乘以0.1或10.

克服NaNs

降低学习率,特别在最开始的100个step中出现NaNs

NaNs可能是由于除以0,或者log 0或负数

尝试评估网络,看看那一层出现了NaNs

你可能感兴趣的:(liandan)