断言失败:预测值必须大于等于0,条件x >= y在逐元素上不成立。

11

我正在运行一个多类模型(总共有40个类),共2000个epoch。这个模型在第828个epoch之前一直很好地运行,但是在第829个epoch时出现了InvalidArgumentError(如下面的屏幕截图所示)。

enter image description here

以下是我用来构建模型的代码。

n_cats = 40 
input_bow = tf.keras.Input(shape=(40), name="bow")
hidden_1 = tf.keras.layers.Dense(200, activation="relu")(input_bow)

hidden_2 = tf.keras.layers.Dense(100, activation="relu")(hidden_1)

hidden_3 = tf.keras.layers.Dense(80, activation="relu")(hidden_2)

hidden_4 = tf.keras.layers.Dense(70, activation="relu")(hidden_3)

output = tf.keras.layers.Dense(n_cats, activation="sigmoid")(hidden_4)

model = tf.keras.Model(inputs=[input_bow], outputs=output)

METRICS = [
    tf.keras.metrics.Accuracy(name="Accuracy"),
    tf.keras.metrics.Precision(name="precision"),
    tf.keras.metrics.Recall(name="recall"),
    tf.keras.metrics.AUC(name="auc"),
    tf.keras.metrics.BinaryAccuracy(name="binaryAcc")
]

checkpoint_cb = tf.keras.callbacks.ModelCheckpoint(
    "my_keras_model.h5", save_best_only=True)
lr_schedule = tf.keras.optimizers.schedules.ExponentialDecay(initial_learning_rate=1e-2,
                                                             decay_steps=10000,
                                                             decay_rate=0.9)


adam_optimizer = tf.keras.optimizers.Adam(learning_rate=lr_schedule)
model.compile(loss="categorical_crossentropy",
              optimizer="adam", metrics=METRICS)

training_history = model.fit(
    (bow_train),
    indus_cat_train,
    epochs=2000,
    batch_size=128,
    callbacks=[checkpoint_cb],
    validation_data=(bow_test, indus_cat_test))

请帮助我理解TensorFlow的这种行为。是什么导致了这个错误?我已经阅读了这篇文章这篇文章,但在我的情况下,它们似乎都不是正确的解释。


你找到解决方案了吗?我也遇到了同样的错误。 - Spandyie
4个回答

22

4
第二个链接失效了,你能提供更新后的链接吗? - Spandyie

3
我在我的多标签分类LSTM模型中遇到了完全相同的问题。在调整过程中,我发现学习率越大,这种错误就越容易发生。对于您的问题,您指定的initial_learning_rate=1e-2可能已经太高了。对于我的模型,我有以下体验: lr=0.1 -> 错误总是发生 lr=0.01 -> 错误很少发生 lr=0.05 -> 从未出现过错误(至今)
这些值仅基于我在早期停止调整期间观察到的情况,因此我认为对于完整的训练运行,这种错误的风险实际上更高。此外,该错误似乎与神经网络拓扑无关。
@awilliea提供的上述答案称,该错误与AUC指标有关。我无法确定其是否正确。但至少我可以确认,像建议的那样删除AUC和其他一些度量标准也适用于我的问题。在使用任何学习率并且没有这些度量标准测试我的模型时,错误永远不会发生。然而,对于大多数问题,您需要这些度量标准,因此我建议通过学习率解决问题。

1
在你的输出 Dense 层中,你必须将激活函数设置为 "softmax",因为这是多类分类问题。
此外,像 "binaryAcc" 和 "AUC" 这样的指标在这里不起作用,因为它们只用于二元分类。

0

虽然这个链接可能回答了问题,但最好在此处包含答案的基本部分并提供参考链接。如果链接页面更改,仅有链接的答案可能会失效。-【来自审查】 - Roshin Raphel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接