【发布时间】:2017-05-05 01:14:03
【问题描述】:
我是 Python 和 Keras 的新手,我已经成功构建了一个神经网络,可以在每个 Epoch 之后保存权重文件。但是,我想要更多粒度(我正在可视化时间序列中的层权重分布),并且希望在每 N 个批次之后保存权重,而不是每个 epoch。
有人有什么建议吗?
【问题讨论】:
标签: keras
我是 Python 和 Keras 的新手,我已经成功构建了一个神经网络,可以在每个 Epoch 之后保存权重文件。但是,我想要更多粒度(我正在可视化时间序列中的层权重分布),并且希望在每 N 个批次之后保存权重,而不是每个 epoch。
有人有什么建议吗?
【问题讨论】:
标签: keras
您可以创建自己的回调 (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)])
【讨论】:
正如 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 )
【讨论】: