情况简介
最近在搭建一个基于神经网络( two-stream Convnet)的framework, 可以从包含人脸的video里提取出此人对应的生理数据,例如心率和呼吸率。这个远程监控功能在许多方面都有应用,比如用于驾驶辅助系统,来监控驾驶员的身体及情绪状况等。
在搭建完模型开始训练的过程中,模型难以收敛,最终的预测效果也很不理想。分析了一下问题,计划从以下几个角度入手调试模型,并清理数据。
可能的问题及解决方案
数据集预处理的问题
1.问题 :观察模型输出,发现output 均为负数。通过查看labels分布发现,负类样本数目为正类的两倍。
解决方案:可以手动oversampling来增大正类样本的占比。
隐患:也许真实分布中,负类出现的概率就是远远大于正类。这样一来,人为上调正类的占比也许会破坏最终结果。
2.问题 :模型的预测准确率一直在random徘徊,表明模型根本没有学习。猜测或者是数据存在问题导致模型无法学到规律,或者是模型搭建有bug。
解决方案:首先,用经典的MNIST数据集来train这个模型,完成Handwritten Digit Recognition的任务,来检测模型搭建有无问题。若没有问题,则很有可能是数据集的错误。
-
问题 :模型是基于two-stream Convnet,因此需要小心设计temporal stream的dynamic input。现在使用的normalized frame difference由于subjects的运动有许多异常值,也许是这些异常值产生噪音,加大了学到真实relationship的难度。
解决方案:使用来clip输入,会显著减小模型由于异常值而产生的难以converge的问题。
模型不符合数据分布
1.问题 :观察labels的分布,发现它们的绝对值很小(<0.1),并且集中在两三个值周围。现在使用的linear regression模型,loss为MSE。因此backpropagate时的也许gradient不够大,造成难以训练调试。
解决方案:转换陈classification问题。或者把MSE替换成MAE / Huber Loss,etc.
训练方法不当
1.问题 :batch size队训练的影响:batch太大时,有可能导致gradient的更新方向变得随机。
2.问题 :有30%的值比较分散,容易产生较大的grads,导致网络难以收敛。
解决方案:clip掉过大的grads以后,网络的loss明显稳定。再配合适当的lr,可让网络的loss稳定下降。
网友评论