Keras 的多输出回归问题

数据挖掘 机器学习 喀拉斯 回归
2021-09-28 11:45:27

特征数:12,-15 < 每个特征 < 15

目标数: 6 , 0 < 每个目标 < 360

示例数:262144

我的归一化:我对特征进行了归一化,使它们介于 0 和 1 之间。我对目标进行了归一化,使它们介于 1 和 10 之间。

这是我正在使用的模型:

model = tf.keras.models.Sequential([
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(128, activation=tf.nn.relu),
    tf.keras.layers.Dense(128, activation=tf.nn.relu),
    tf.keras.layers.Dense(128, activation=tf.nn.relu),
    tf.keras.layers.Dense(128, activation=tf.nn.relu),
    tf.keras.layers.Dense(128, activation=tf.nn.relu),
    tf.keras.layers.Dense(128, activation=tf.nn.relu),
    tf.keras.layers.Dense(6, activation='linear')
])

model.compile(optimizer="rmsprop", loss='mean_squared_error', metrics=['accuracy'])

model.fit(training_x, training_y, epochs=10, batch_size=100)

这是我得到的最好结果(培训):

235929/235929 [==============================] - 8s 33us/step - loss: 8.9393e-04 - acc: 0.6436

测试:

损失:0.00427692719418488

加号:0.033187106618348276

我在测试集上的准确率几乎为 0%!我需要一个模型来解决这个机器学习问题。

2个回答

准确性是分类的指标,而不是回归的指标。

Accuracy=Correct classificationNumber of classifications

因此,当您将准确性用于回归时,只有actual_label == predicted_label被评估为真的值才会被计为正确的分类。当您进行回归时,这种情况很少发生,导致精度接近于零。

相反,您应该使用诸如平均绝对误差或均方误差之类的东西作为回归的验证指标。

您不必对回归目标进行归一化,但在另一种情况下,您可能希望对它们进行缩放,以便一个输出的损失不会超过其他输出的损失。

这里非常重要的是,您预测的角度是周期性有界的,但您将它们作为连续值。所以 359 在输出中应该非常接近 001,但事实并非如此。将您的标签转换为其正弦和余弦分量。从预测转换回角度。

并使用 MAE 和 MSE 作为指标。您想要哪一个作为您的损失函数取决于您的应用程序。必须使用该领域的专业知识来做某事。

附录:您的网络非常非常深,并且您的输入没有均值 0 和标准 1。您确实需要修复标准化或在 Flatten 之后添加 BatchNormalization 层。并且您需要将权重初始化从 glorot 更改为 he_uniform。此外,您的网络可能太深了。