【问题标题】:Understanding Feed Forward Neural Network Output了解前馈神经网络输出
【发布时间】:2019-06-22 06:20:37
【问题描述】:

我已经为回归问题构建了一个具有 3 个隐藏层的前馈神经网络。我用于验证的指标是 MAPE。以下是模型参数

#Define the model
NN_model = Sequential()

# The Input Layer :
NN_model.add(Dense(128, kernel_initializer='normal',input_dim = X_train.shape[1], activation='relu'))

# The Hidden Layers :
NN_model.add(Dense(256, kernel_initializer='normal',activation='relu'))
NN_model.add(Dense(256, kernel_initializer='normal',activation='relu'))
NN_model.add(Dense(256, kernel_initializer='normal',activation='relu'))

# The Output Layer :
NN_model.add(Dense(1, kernel_initializer='normal',activation='linear'))

# Compile the network :
NN_model.compile(loss='mean_absolute_percentage_error', optimizer='adam', metrics=['mean_absolute_percentage_error'])
##NN_model.compile(loss='mean_absolute_error', optimizer='adam', metrics=['mean_absolute_error'])
NN_model.summary()

示例输出如下所示

Train on 18000 samples, validate on 4500 samples
Epoch 1/500
18000/18000 [==============================] - 3s 148us/step - loss: 672.5252 - mean_absolute_percentage_error: 672.5252 - val_loss: 29.3799 - val_mean_absolute_percentage_error: 29.3799

Epoch 00001: val_loss improved from inf to 29.37992, saving model to Weights-001--29.37992.hdf5
Epoch 2/500
18000/18000 [==============================] - 2s 133us/step - loss: 739.9019 - mean_absolute_percentage_error: 739.9019 - val_loss: 220.4918 - val_mean_absolute_percentage_error: 220.4918

Epoch 00002: val_loss did not improve from 29.37992
Epoch 3/500
18000/18000 [==============================] - 2s 129us/step - loss: 840.8005 - mean_absolute_percentage_error: 840.8005 - val_loss: 18.5716 - val_mean_absolute_percentage_error: 18.5716

我的问题是,在每个时期,我看到平均绝对百分比误差和验证平均绝对百分比误差。后者似乎低于我的预期,为什么平均绝对百分比误差如此不同并且远高于验证平均绝对百分比误差?

另外,为什么验证平均绝对百分比误差波动如此之大?

感谢任何意见。

【问题讨论】:

    标签: python keras neural-network deep-learning feed-forward


    【解决方案1】:

    看起来您的模型根本无法学习任何东西。你检查你的输入数据了吗?

    另一个问题可能是梯度太大,这会导致“不收敛行为”。因此,您的损失只是“随机”波动。

    因此,请检查您的训练数据,尝试对其进行缩放并尝试使用不同的损失函数!希望对您有所帮助。

    【讨论】:

    • 感谢您的输入,我确实看到它与训练数据有关。我在在线提供的住房奖励数据集上使用了相同的模型参数,它非常适合。训练和验证误差收敛在 5% 左右。此外,就像我在上面所说的,训练误差几乎保持接近验证误差,直到大约前 60% 的数据并在最后 20% 中爆炸。当我设置 validation_split = 0.5 时,错误会反转。训练错误现在与我之前看到的验证错误相同,并且验证错误已经爆炸。
    【解决方案2】:

    MAPE 可能相当低,因为在输入值方面没有太大的分布。

    让我们假设我们在谈论经典的线性回归,以使事情更容易可视化。不幸的是,您碰巧在一个不错的经典 sigmoid 上运行线性回归 - 从零到一,拐点在 0.5,从 -infinf

    您的尽最大努力将是定义为0x+0.5 的行。您只是物理上无法使用您正在使用的模型做得更好。然而,你的 MAPE 将是 50%,而不是像 10000% 这样的疯狂。

    当然,该模型完全是垃圾,但它的错误仅限于相当小的值范围。

    现在,使用 DNN 就更棘手了,因为您需要担心所有这些额外的维度,但它可能是调试模型的一个不错的线索。

    就波动而言,很难告诉 ATM - 您刚刚展示了前三个时期,它可能仍在试图在数据上找到立足点。在进行任何诊断之前,我会在进一步培训期间查看问题是否仍然存在。

    【讨论】:

    • 感谢您的意见。我尝试删除异常值,并尝试消除数据的偏斜,验证错误显着下降。然而,我观察到的是训练误差几乎保持接近验证误差,直到大约前 60% 的数据并在最后 20% 中爆炸。当我设置 validation_split = 0.5 时,错误会反转。训练错误现在与我之前看到的验证错误相同,并且验证错误已经爆炸。我看到它与数据有关,但无法准确识别导致它的数据点。你的经历是否敲响了警钟?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-11
    • 2018-10-20
    • 2015-06-04
    • 1970-01-01
    • 2015-12-23
    • 2016-11-29
    • 1970-01-01
    相关资源
    最近更新 更多