训练损失极低,预测值始终相同

时间:2021-07-15 13:37:26

标签: python tensorflow tf.keras

问题摘要

训练我的数据导致非常奇怪的冗长:

loss: -35657827.5218 - accuracy: 0.5018 - categorical_accuracy: 1.0000

预期的预测结果是-1、0或1。但训练后的模型只输出0

数据

我准备了 200 万行数据,结构如下。 这些都是特点。它们是介于 -1 和 1 之间的浮点值。

[
    "relative_price_week",
    "relative_price_day",
    "relative_price_hour",
    "relative_price_fivemin",
    "relative_volume_week",
    "relative_volume_day",
    "relative_volume_hour",
    "swing_month",
    "swing_week",
    "swing_day",
    "swing_hour",
    "swing_fivemin",
]

并且输出应该是三个选项之一,-1、0 或 1。

Visualized data

模型

input = Input(shape=(12,))
x = Dense(64, activation='relu')(input)
x = Dense(32, activation='relu')(x)
x = Dense(16, activation='relu')(x)
output = Dense(1, activation='sigmoid')(x)
model = Model(inputs=input, outputs=output)
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy', 'categorical_accuracy'])
model.fit(train_features, train_labels, batch_size=100000, epochs=10)

该模型的先前版本也会产生无意义的数据。我的意思是,它只会输出几个固定输出中的一个。
一个版本将具有三个输出列 ['buy_conf', 'hold_conf', 'sell_conf'],每个列代表一个介于 0 和 1 之间的值。
不幸的是,这也会导致精度为 0.9 的奇怪输出和类似的负损失。此模型的训练输出也会将极少数选项之一作为每列的输出。

问题

  • 您是否立即发现此代码有任何明显错误?
  • 您能否建议一种方法来找到解决此问题的方法?

2 个答案:

答案 0 :(得分:2)

sigmoid 激活函数可以输出一个介于 01
之间的值 但是您的标签 -1,0,1 不在 01
范围内 因此,在最后的 tanh 层中使用 Dense 激活函数而不是 sigmoid 将起作用,因为 tanh 的范围为 -11

答案 1 :(得分:0)

我最终没有找到使用 Tensorflow 的解决方案。
我最终使用了 ML.net,这更适合我的情况,因为我的应用程序的其余部分使用 C#。
它还对初学者友好,可以轻松完成我想做的事情。

这不是适合所有人的解决方案,但如果其他人阅读了此内容,也许它也适用于您的情况。