【问题标题】:Extremely low loss on training, prediction is always the same value训练损失极低,预测值始终相同
【发布时间】:2021-07-15 13:37:26
【问题描述】:

问题摘要

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

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

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

数据

我准备了两百万行数据,结构如下。 这些都是特征。它们是介于 -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。

型号

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 的奇怪输出和类似的负损失。该模型的训练输出也将使用极少数选项之一作为每一列的输出。

问题

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

【问题讨论】:

  • 我不知道您的数据是什么样的,尽管您的数据看起来有一半带有状态 0。分类准确性没有解释,因为您只有 1 个输出索引;所以索引 0 根据定义为真。另一个问题可能是您的输出激活函数。它是为了创建一个二元决策边界,没有什么可以聚合 3 个类。最后,input 是内置库的一部分。请不要覆盖它。
  • @Uvar 我添加了有关数据的一些信息的图像。我不会立即将任何内容转换为 int 或 float。我会调整输入名称,谢谢!
  • 二元交叉熵作为损失,顾名思义,适用于你没有看到的 2 类问题。看看能不能找到资源。
  • 你能尝试用categorical_crossentropy损失编译模型,最后一个密集层上有3个输出节点吗?
  • @Uvar 在 Mushfirat Mohaimin 之前关于更改为 tanh 激活的建议导致输出始终为 -1 之后。更改为 categorical_crossentropy 损失和最后一个密集 (x) 层上的 3 个输出节点(未隐藏,因为它不起作用)后,我们的训练如下所示:loss: nan - accuracy: 0.5020 - categorical_accuracy: 1.0000 并且预测也输出 NaN

标签: python tensorflow tf.keras


【解决方案1】:

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

【讨论】:

  • 太好了,谢谢!乍一看,奇怪的损失似乎已变为 -0.24 左右,但我的准确度仍为 0.50。稍后我会尝试运行一些预测...
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2021-07-23
    • 1970-01-01
    • 2023-03-06
    • 2019-11-29
    • 2020-06-27
    • 2018-01-15
    • 1970-01-01
    • 2017-08-10
    • 1970-01-01
    相关资源
    最近更新 更多