我目前正在 Keras 中训练 CNN。 现在我想记录训练过程的历史记录以供以后可视化使用:
history_callback = model.fit(train_generator,
steps_per_epoch=EPOCH_STEP_TRAIN,
validation_data=test_generator,
validation_steps=EPOCH_STEP_TEST,
epochs=NUM_OF_EPOCHS,
callbacks=callbacks)
val_loss_history = history_callback.history['val_loss']
loss_history = history_callback.history['loss']
numpy_val_loss_history = np.array(val_loss_history)
numpy_loss_history = np.array(loss_history)
np.savetxt(checkpoint_folder + "valid_loss_history.txt", numpy_val_loss_history, delimiter=",")
np.savetxt(checkpoint_folder + "loss_history.txt", numpy_loss_history, delimiter=",")
验证损失已正确保存并且与控制台的输出完全匹配。
但是我存储的损失值在训练时与控制台的输出值不匹配。请看这里:
121/121 [==============================] - 61s 438ms/step - loss: 0.9004 - recall: 0.5097 - precision: 0.0292 - acc: 0.8391 - val_loss: 0.8893 - val_recall: 0.0000e+00 - val_precision: 0.0000e+00 - val_acc: 0.9995
Epoch 2/3
121/121 [==============================] - 52s 428ms/step - loss: 0.5830 - recall: 0.1916 - precision: 0.3660 - acc: 0.9898 - val_loss: 0.5422 - val_recall: 0.3007 - val_precision: 0.7646 - val_acc: 0.9996
Epoch 3/3
121/121 [==============================] - 52s 428ms/step - loss: 0.3116 - recall: 0.3740 - precision: 0.7848 - acc: 0.9920 - val_loss: 0.5248 - val_recall: 0.3119 - val_precision: 0.6915 - val_acc: 0.9996
history_callback.history['loss'] 的输出是:
0.8124346733093262
0.4653359651565552
0.30956554412841797
我的损失函数是:
def dice_coef(y_true, y_pred, smooth=1e-9):
y_true_f = K.flatten(y_true)
y_pred_f = K.flatten(y_pred)
intersection = K.sum(y_true_f * y_pred_f)
return (2. * intersection + smooth) / (K.sum(y_true_f**2) + K.sum(y_pred_f**2) + smooth)
def dice_loss(y_true, y_pred):
return (1-dice_coef(y_true, y_pred))
我也尝试过:
def dice_loss(y_true, y_pred):
return tf.reduce_mean(1-dice_coef(y_true, y_pred))
这并没有改变任何事情。
有没有人可以解释这种奇怪的行为?
好像我也遇到了同样的问题。
我们的共同点是TF 版本 2.4.1(CUDA 11.2、Windows 10 Pro、Quadro T1000)。
当我使用 TF 版本 2.8.0(CUDA 11.4、Debian 10、Tesla T4)使用相同数据训练相同网络时,问题消失了
我们唯一的共同点是我们都使用 CNN。