【问题标题】:Python/Keras - Saving model weights after every N batchesPython/Keras - 每 N 个批次后保存模型权重
【发布时间】:2017-05-05 01:14:03
【问题描述】:

我是 Python 和 Keras 的新手,我已经成功构建了一个神经网络,可以在每个 Epoch 之后保存权重文件。但是,我想要更多粒度(我正在可视化时间序列中的层权重分布),并且希望在每 N 个批次之后保存权重,而不是每个 epoch。

有人有什么建议吗?

【问题讨论】:

    标签: keras


    【解决方案1】:

    您可以创建自己的回调 (https://keras.io/callbacks/)。比如:

    from keras.callbacks import Callback
    
    class WeightsSaver(Callback):
        def __init__(self, N):
            self.N = N
            self.batch = 0
    
        def on_batch_end(self, batch, logs={}):
            if self.batch % self.N == 0:
                name = 'weights%08d.h5' % self.batch
                self.model.save_weights(name)
            self.batch += 1
    

    我使用self.batch 而不是提供的batch 参数,因为后者在每个时期从0 重新开始。

    然后将其添加到您的健身通话中。例如,每 5 个批次保存一次权重:

    model.fit(X_train, Y_train, callbacks=[WeightsSaver(5)])
    

    【讨论】:

    • RuntimeWarning:方法 (on_train_batch_end) 比批量更新 (0.832980) 慢。检查你的回调。我的 N 值为 2500
    【解决方案2】:

    正如 grovina 所说,您可以创建自己的回调。 https://keras.io/callbacks/ 在此处查看“回调”的来源:https://github.com/keras-team/keras/blob/master/keras/callbacks.py#L148

    在回调类下,有许多函数可以满足您的需求。在您的情况下,如果您想每 N 个时期保存一次模型,请定义函数“on_epoch_end”。

    示例代码

    class WeightsSaver(Callback):
      def __init__(self, N):
        self.N = N
        self.epoch = 0
    
      def on_epoch_end(self, epoch, logs={}):
        if self.epoch % self.N == 0:
            name = ('weights%04d.hdf5') % self.epoch
            self.model.save_weights(name)
        self.epoch += 1
    
    callbacks_list = [WeightsSaver(10)] #save every 10 models
    model.fit(train_X,train_Y,epochs=n_epochs,batch_size=batch_size, callbacks=callbacks_list )
    

    【讨论】:

      猜你喜欢
      • 2018-12-13
      • 1970-01-01
      • 2019-05-20
      • 1970-01-01
      • 2019-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多