我正在为一些嘈杂的卫星数据拟合模型。标签是河流条上岩石的尺寸。有一个嘈杂但重要的关系。我只有250点,但是该方法会扩展并最终运行更大的数据集。我正在查看各种模型(RANSAC,Huber,SVM回归)和DNN。我的DNN结果似乎好得令人难以置信。网络看起来像:
model = Sequential()
model.add(Dense(128, kernel_regularizer= regularizers.l2(0.001), input_dim=NetworkDims, kernel_initializer='he_normal', activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(128, kernel_regularizer= regularizers.l2(0.001), kernel_initializer='normal', activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(64, kernel_regularizer= regularizers.l2(0.001), kernel_initializer='normal', activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(64, kernel_regularizer= regularizers.l2(0.001), kernel_initializer='normal', activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(32, kernel_regularizer= regularizers.l2(0.001), kernel_initializer='normal', activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(1, kernel_initializer='normal'))
# Compile model
model.compile(loss='mean_squared_error', optimizer='adam')
return model
当我保存历史记录并绘制训练损失(绿色点)和验证损失(青色线)与历元时,我得到了:
培训和验证损失逐渐减少。对于一个小的数据集,我期望验证损失能够按照自己的方式进行。实际上,如果我使用此网络运行10倍的交叉val得分,则交叉val得分报告的错误确实会下降。这看起来好得令人难以置信。这意味着我可以训练1000个纪元,并且仍然可以改善结果。如果看起来好得难以置信,通常是,但是为什么?
编辑:更多结果。
因此,我尝试将每个的辍学率削减到0.1,并删除L2。有趣的。通过调低的落差,我得到了更好的结果:
没有L2,存在过度拟合: No L2 reg
答案 0 :(得分:0)
我的猜测是,您在每个图层上的辍学率都很高,这就是为什么仅在训练数据上过度拟合会遇到麻烦的原因。我的预测是,如果您降低辍学率和正则化程度,它将更快地学习训练数据。
我不太确定结果是否太好以至于不能成立,因为很难基于损失函数来确定模型的良好程度。但应该是辍学和正则化阻止了它在几个时期内过度拟合。