如果与 one-hot 标签和 categorical_crossentropy amnd softmax 输出一起使用,为什么 keras 模型会预测全部

Why does keras model predicts all as ones if used with one-hot labels and categorical_crossentropy amnd softmax output

我有一个简单的 tf.keras 模型:

inputs = keras.Input(shape=(9824,))
dense = layers.Dense(512, activation=keras.activations.relu, kernel_initializer=init)
x = dense(inputs)
x = layers.Dense(512, activation=keras.activations.relu)(x)
outputs = layers.Dense(3, activation=keras.activations.softmax)(x)
model = keras.Model(inputs=inputs, outputs=outputs)

当我用稀疏分类交叉熵和实际标签编译它时,它按预期工作。 但是当我尝试对标签进行单热编码(使用 tf.keras.utils.to_categorical)并使用 categorical_crossentropy(这样我可以在训练期间使用召回率和精度作为指标)时,模型将所有内容预测为:

>>>print(predictions)
[[1. 1. 1.]
 [1. 1. 1.]
 [1. 1. 1.]
 ...
 [1. 1. 1.]
 [1. 1. 1.]
 [1. 1. 1.]]

如果我理解正确,输出层中的 softmax 激活应该导致输出在范围 (0,1) 内并且总和为 1。 那么,怎么可能 class 预测都是 1? 我搜索了几个小时的答案,但无济于事。

编辑

这里是极简主义example

我忘了说我使用的是 scikeras 包。根据 documentation 中的示例,我假设模型是隐式编译的。这是 classifier 构造函数:

clf = KerasClassifier(
    model=keras_model_target,
    loss=SparseCategoricalCrossentropy(),
    name="model_target",
    optimizer=Adam(),
    init=GlorotUniform(),
    metrics=[SparseCategoricalAccuracy()],
    epochs=5,
    batch_size=128
)

我用

拟合模型
result = clf.fit(x_train, y_train)

并预测:

predictions = clf.predict(x)

这是 SciKeras 中的一个错误,已在 v0.3.1 版本中修复。更新到最新版本应该可以解决这个问题。

至于错误本身,这是由于我们如何索引 numpy 数组,请参阅 this diff 了解详细信息。