过拟合:
overfitting,train的效果很好,但是test时不行,因为模型复杂度太高,因为数据都会有一些随机的噪声,模型过度拟合带噪声的数据,导致test时拟合不好
欠拟合:
underfiting,train和test的loss一直下不去,而且acc也差,往往是因为模型复杂度小于实际数据的复杂度。
多项式阶数越高的模型能拟合表达的就越复杂,网络越深,参数越多,模型的表达能力也越强
下图就是一个典型的过拟合,train的表现很好,但是在某个节点后面,由于模型过于复杂,拟合了很多随机噪声,导致test效果不好
加入验证集就可以及时停止训练,避免过拟合
验证集:
将数据集划分为三个部分,分别为训练集,验证集(validation),测试集
数据集加载时默认加载成两部分,需要自己把训练集划分出一个验证集出来
把训练集划分出1000个用来做验证集,验证集的目的是验证训练的效果。比如训练时用100个epoch,但是不一定要把100个epoch都训练完,因为模型可能在迭代次数多了以后会出现性能下降,而且浪费时间,所以设置验证集。比如设置5个epoch做一次验证,如果相较于上次验证acc降低了,那就及时停止。
network.fit(db_train, epochs=5, validation=db_val, validation_freq=2)
validation=db_val是指定验证集, epochs是最多训练epochs次,validation_freq=2是指两次epochs做一个验证
交叉验证:
如果每次都用同一个验证集做验证的话,会导致模型对那个验证集有依赖性和记忆性,所以需要交叉验证,也就是每次验证取训练集中不同的部分。
如何防止过拟合:
1. 更多的数据
2.减少网络深度
3.加入正则项
4.dropout层
5.加入验证集,及时停止训练
regularization正则化: