tensorflow:只能在val_acc可用的情况下保存最佳模型,跳过



我的tf.callbacks.ModelChekpoint有问题。正如您在我的日志文件中看到的,警告总是出现在计算val_acc的最后一次迭代之前。因此,Modelcheckpoint从未找到val_acc

Epoch 1/30
1/8 [==>...........................] - ETA: 19s - loss: 1.4174 - accuracy: 0.3000
2/8 [======>.......................] - ETA: 8s - loss: 1.3363 - accuracy: 0.3500 
3/8 [==========>...................] - ETA: 4s - loss: 1.3994 - accuracy: 0.2667
4/8 [==============>...............] - ETA: 3s - loss: 1.3527 - accuracy: 0.3250
6/8 [=====================>........] - ETA: 1s - loss: 1.3042 - accuracy: 0.3333
WARNING:tensorflow:Can save best model only with val_acc available, skipping.
8/8 [==============================] - 4s 482ms/step - loss: 1.2846 - accuracy: 0.3375 - val_loss: 1.3512 - val_accuracy: 0.5000
Epoch 2/30
1/8 [==>...........................] - ETA: 0s - loss: 1.0098 - accuracy: 0.5000
3/8 [==========>...................] - ETA: 0s - loss: 0.8916 - accuracy: 0.5333
5/8 [=================>............] - ETA: 0s - loss: 0.9533 - accuracy: 0.5600
6/8 [=====================>........] - ETA: 0s - loss: 0.9523 - accuracy: 0.5667
7/8 [=========================>....] - ETA: 0s - loss: 0.9377 - accuracy: 0.5714
WARNING:tensorflow:Can save best model only with val_acc available, skipping.
8/8 [==============================] - 1s 98ms/step - loss: 0.9229 - accuracy: 0.5750 - val_loss: 1.2507 - val_accuracy: 0.5000

这是我训练CNN的代码。

callbacks = [
TensorBoard(log_dir=r'C:UsersredaDesktoplogs{}'.format(Name),
histogram_freq=1),
ModelCheckpoint(filepath=r"C:UsersredaDesktopcheckpoints{}".format(Name), monitor='val_acc',
verbose=2, save_best_only=True, mode='max')]
history = model.fit_generator(
train_data_gen, 
steps_per_epoch=total_train // batch_size,
epochs=epochs,
validation_data=val_data_gen,
validation_steps=total_val // batch_size,
callbacks=callbacks)

我知道这些事情有时会有多令人沮丧。。但是tensorflow要求你明确地写出你想要计算的度量的名称

您需要实际说出"val_accurcy">

metric = 'val_accuracy'
ModelCheckpoint(filepath=r"C:Usersreda.elhailDesktopcheckpoints{}".format(Name), monitor=metric,
verbose=2, save_best_only=True, mode='max')]

希望这有帮助=(

添加到已接受的答案中,因为我刚刚在努力解决这个问题。您不仅必须使用完整的度量名称,它还必须与您的model.compile、ModelCheckpoint和EarlyStoping相匹配。我有一个设置为accuracy,另外两个设置为val_accuracy,但它不起作用。

在训练一个epoch后打印度量,如下所示。这将打印为您的模型定义的指标。

hist = model.fit(...)
for key in hist.history:
print(key)

现在将它们替换到您的度量中。它会像魅力一样发挥作用。

这个破解是由这位先生在下面的链接中给出的。谢谢他!!https://github.com/tensorflow/tensorflow/issues/33163#issuecomment-540451749

检查点和Earlystopping回调中的

monitor='val_loss'对我都有效。

我遇到了同样的问题,即使在提到metric=val_accuracy之后,它也不起作用。所以我只是把它改成metric=val_acc,它就起作用了。

如果您在model.fit((函数中使用validation_steps或steps per epocts。删除该参数。验证损失和准确性将开始显现。只需尽可能包含几个参数:

model_history = model.fit(x=aug.flow(X_train, y_train, batch_size=16), epochs=EPOCHS,validation_data=[X_val, y_val], callbacks=[callbacks_list])

如果您使用ModelCheckpoint和EarlyStoping,那么在这种情况下;momitor";度量应该和"准确性"一样。

此外,EarlyStoping在某些tensorflow版本中不支持所有指标,因此您必须选择两者通用的指标以及最适合您的模型的指标。

即使将参数从monitor='val_acc'更改为monitor='val_accuracy',我仍然有这个问题。

你可以从Keras查看这个链接,并确保你保持传递的参数和值不变。我删除了传递的额外参数,这对我很有效!

之前

checkpoint = ModelCheckpoint("mnist-cnn-keras.h5", monitor='val_acc', verbose=1, save_best_only=True, save_weights_only=False, mode='auto', save_freq=1)

之后

checkpoint = ModelCheckpoint("./", monitor='val_accuracy', verbose=2, save_best_only=True, mode='max')

运行它时,您必须编写名称。您可能使用了不同的度量,而不是度量部分中的"准确性"。BinaryAccuracy、SparseAccuracy和CategoricalAccuracy等。例如,当您使用BinaryAccurate时,在运行部分中会写入"binary_precity",而不是"准确性"。这就是您应该如何在监视器部分中写入的内容。

在第一次运行后,您可能还会发现您的模型度量后面附加了一个递增的数字。例如

for key in history.history:
print(key)
loss
accuracy
auc_4
precision_4
recall_4
true_positives_4
true_negatives_4
false_positives_4
false_negatives_4
val_loss
val_accuracy
val_auc_4

如果是这种情况,您可以在每次运行之前重置会话,这样就不会附加数字。

for something in something_else:
tf.keras.backend.clear_session()  # resets the session
model = define_model(...)
history = train_model(...)

相关内容

最新更新