不能过度拟合的神经网络?

时间:2018-07-30 12:07:59

标签: tensorflow keras

我正在为一些嘈杂的卫星数据拟合模型。标签是河流条上岩石的尺寸。有一个嘈杂但重要的关系。我只有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

当我保存历史记录并绘制训练损失(绿色点)和验证损失(青色线)与历元时,我得到了:

Loss vs Epoch

培训和验证损失逐渐减少。对于一个小的数据集,我期望验证损失能够按照自己的方式进行。实际上,如果我使用此网络运行10倍的交叉val得分,则交叉val得分报告的错误确实会下降。这看起来好得令人难以置信。这意味着我可以训练1000个纪元,并且仍然可以改善结果。如果看起来好得难以置信,通常是,但是为什么?

编辑:更多结果。

因此,我尝试将每个的辍学率削减到0.1,并删除L2。有趣的。通过调低的落差,我得到了更好的结果:

10% dropout rate

没有L2,存在过度拟合: No L2 reg

1 个答案:

答案 0 :(得分:0)

我的猜测是,您在每个图层上的辍学率都很高,这就是为什么仅在训练数据上过度拟合会遇到麻烦的原因。我的预测是,如果您降低辍学率和正则化程度,它将更快地学习训练数据。

我不太确定结果是否太好以至于不能成立,因为很难基于损失函数来确定模型的良好程度。但应该是辍学和正则化阻止了它在几个时期内过度拟合。