python-3.x Assert失败:预测必须>= 0,条件x>= y不适用于元素

zd287kbt  于 2023-02-01  发布在  Python
关注(0)|答案(3)|浏览(155)

我正在运行一个多类模型(总共40类)2000个历元。该模型运行良好,直到828历元,但在829历元,它给我一个InvalidArgumentError(见下面的截图)

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

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的这种行为。是什么导致了这个错误?我已经阅读了thisthis,但在我的情况下,这些似乎不是正确的解释。

gv8xihay

gv8xihay1#

我认为这个错误是由于AUC指标的设置造成的。(参见https://www.tensorflow.org/api_docs/python/tf/keras/metrics/AUC)预测值应该都是非负值,而不是[-nan,-nan,...]作为模型输出。您可以尝试使用http://deeplearning.net/software/theano/tutorial/nan_tutorial.html中的一些方法来处理NAN。如果您想快速解决这个错误,可以直接从列表中删除AUC指标。

zzwlnbp8

zzwlnbp82#

我在我的多标签分类LSTM模型中遇到了完全相同的问题。在调优过程中,我发现学习速率越大,越有可能发生此错误。您的initial_learning_rate=1e-2规范可能对您的问题来说已经太高了。对于我的模型,我遇到了以下问题:
lr=0.1-〉总是发生错误
lr=0.01-〉很少发生错误
lr=0.05-〉从未发生错误(直到现在)
这些值完全基于我在早期停止的调优过程中的观察,所以我假设对于完整的训练运行,这种错误的风险实际上更高。而且,这种错误似乎与神经网络的拓扑结构无关。
上面@awilliea的回答指出错误与AUC指标有关。我不能肯定这是否正确。但至少我可以确认,按照建议删除AUC和其他一些指标也可以解决我的问题。在使用任何学习率和不使用这些指标测试我的模型时,错误从未发生。然而,对于大多数问题,您需要这些指标。所以我建议通过学习率来解决这个问题。

w8f9ii69

w8f9ii693#

在你的输出密集层你必须设置激活函数为“软最大”,因为这是多类分类问题。
此外,像“binaryAcc”和“AUC”这样的指标在这里也不起作用,因为它们只专门用于二进制分类。

相关问题