如何查看模型随时间推移而不是时期的进展?

时间:2019-10-06 16:45:54

标签: tensorflow matplotlib keras

我正在使用Tensorflow-Keras训练神经网络。我当前的代码设置为使用CSVLogger跟踪历时的进度,并使用matplotlib pyplot绘制训练与验证的关系图,以准确度和损失度。对于这两个图形图,值也都针对时期#进行绘制。

是否可以绘制模型在一段时间内的训练进度?意思是说,不是将时代号作为x轴,而是可以有执行时间吗?

之所以这样做,是因为我正在进行超参数调整并提前停止,因此每个模型可能会在不同的时间停止,但是由于架构和配置的不同,同时每个时间的平均执行时间不同可能也会有所不同。

这样,相比起时期数,对于我来说比较比较不同模型的损失和准确性收敛以及发生早停所需的时间可能更有意义。毕竟,如果模型A可以在停止之前的20个周期内达到0.25的最佳val_loss,以每个周期2分钟的速度,我真的想选择模型B上的模型吗?在停止之前的50个周期内,它的val_loss达到0.275的最佳val_loss ,每个纪元20秒?

1 个答案:

答案 0 :(得分:0)

是的,有可能。为此,您可以创建自己的Keras Callback。为此,您必须扩展Callback类。我创建了一个非常简单的回调,演示了如何跟踪每个时期的数据和时间以及模型的得分。

# Import dependencies
import datetime
from tensorflow.keras import callbacks

# Create new callback
class MyHistory(callbacks.Callback):
    """Adapted from https://github.com/keras-team/keras/blob/master/keras/callbacks/callbacks.py#L614"""

    def on_train_begin(self, logs=None):
        self.epoch = []
        self.timestamps = []
        self.history = {}

    def on_epoch_end(self, epoch, logs=None):
        logs = logs or {}
        self.epoch.append(epoch)
        self.timestamps.append(datetime.datetime.now())
        for k, v in logs.items():
            self.history.setdefault(k, []).append(v)

# Instantiate callback
myHistory = MyHistory()

# Train model using callback
model.fit(..., callbacks=[myHistory])

# Print timestamps & losses
print(myHistory.timestamps)
print(myHistory.history['loss'])

您可以采用类似的方法,以类似的方式扩展[CSVLogger][3]来将时间戳记存储在csv中。