写这篇博客的原因主要是为了总结下在深度学习中我们常会遇到的一些问题,以及不知道如何解决,我准备把这个部分作为一个系列,为了让大家少走一些坑,对于本博客有什么错误,欢迎大家指出,下面切入正题吧。
1. 深度学习,一个令人头疼的问题就是如何调参?
简而言之,如果数据集复杂的话,那么就要增加网络的层数,模型欠拟合了,加节点。
2. 关于验证集的loss曲线和acc曲线震荡,不平滑问题
出现loss震荡不平滑的原因可能如下:
(1) 学习率可能太大
(2) batch size太小
(3) 样本分布不均匀
(4) 加入正则化
3. 对于模型过拟合问题
(1) 换一个简单模型
(2) 增加数据
4. 对于自己定义的损失函数,如果我们加载模型常会提示loss出错,此时解决方法有两个:
(1) 首先用json保存模型用,然后保存权重,加载模型时,先load模型,然后载入权重
(2) load_model函数提供了参数,所以加载时需要加入这个参数,假设自定义参数loss的函数名为cosloss,所以加载时应采用以下方式
- model = load_model('model.h5', {'cosloss':cosloss})
5. 在keras中如果想输出训练过程中训练集合验证集准确值和损失值得变化,可以采用回调函数,具体参考以下方式:
- history=model.fit()
- plt.plot()
- plt.plot(history.history['val_acc'])
- plt.title('model accuracy')
- plt.ylabel('accuracy')
- plt.xlabel('epoch')
- plt.legend(['train', 'test'], loc='upper left')
- plt.show()
- # summarize history for loss
- plt.plot(history.history['loss'])
- plt.plot(history.history['val_loss'])
- plt.title('model loss')
- plt.ylabel('loss')
- plt.xlabel('epoch')
- plt.legend(['train', 'test'], loc='upper left')
- plt.show()
说明:如果你想把每个epoch的accuray结果保存在txt中也是可以的
- accy=history.history['acc']
- np_accy=np.array(accy)
- np.savetxt('save.txt',np_accy)
6. 如果训练中发现loss的值为NAN,这时可能的原因如下:
(1)学习率太高
(2)如果是自己定义的损失函数,这时候可能是你设计的损失函数有问题
7. 对于新手来说,一个比较困惑的地方可能就是不明白,loss值和acc之间的关系,有时候即使acc高,但是loss值也高
一般来说,较高的acc对应的loss较低,但这不是绝对,毕竟他们是两个不同的东西,所以在实际实现中,我们可以对两者进行一个微调。
8. 关于模型epoch轮数?对于一个新模型,迭代多少次才可以收敛,具体应该怎么设置
关于epoch设置问题,我们可以设置回调函数,选择验证集最高的acc作为最优模型。
9. 关于BN和dropout,应该使用哪个?
其实这两个是两个完全不同的东西,BN针对数据分布,dropout是从模型结构方面优化,所以他们两个可以一起使用,对于BN来说其不但可以防止过拟合,还可以防止梯度消失等问题,并且可以加快模型的收敛速度,但是加了BN,模型训练往往会变得慢些。
10. 这一条作为总结吧,多看看keras官方文档,里面基本能找到你需要的东西。这篇暂时就酱~