【发布时间】: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