0

我想对 keras 使用交替更新规则。即每批次我想调用一个常规的基于梯度的步骤,然后调用一个自定义步骤。

我考虑过通过继承优化器或回调来实现它(并使用批量调用)。但是,两者都不会,因为它们都缺少批处理数据和批处理标签(我需要两者)。

关于如何使用 keras 实现自定义交替更新的任何想法?

如果需要,我不介意直接调用 tensorflow 特定的方法,只要我可以继续使用用 keras 框架包装的项目(使用 model.fit、model.predict ..)

4

1 回答 1

-1

尝试创建自定义回调

import keras.callbacks as callbacks

class JSONMetrics(callbacks.Callback):

_model      = None
_each_epoch = None
_metrics    = None
_epoch      = None
_file_json  = None 

def __init__(self,model,each_epoch,logger=None):

    self._file_json = "file_log.json"
    self._model     = model
    self._each_epoch= each_epoch
    self._epoch     = 0
    self._metrics   = {'loss':[], 'acc':[]}

def on_epoch_begin(self, epoch, logs):
    # print('Epoch {0} begin'.format(epoch))
    try:
        with open(self._file_json, 'r') as f:   
            self._metrics = json.load(f)

def on_epoch_end(self, epoch, logs):
    self._logger.info('Nemesis: Epoch {0} end'.format(epoch))

    self._metrics['loss'].append(logs.get('loss'))
    self._metrics['acc'].append(logs.get('acc'))
    with open(self._file_json, 'w') as f:
        data = json.dump(self._metrics, f)

    if self._epoch % self._each_epoch == 0:

        file_name = 'weights%08d.h5' % self._epoch
        #print('Saving weights at {0} file'.format(file_name))
        self._model.save_weights(file_name)

    self._epoch += 1

例如,您可以调用 self.model 来解决您的问题并保存 acc 和 loss。

于 2017-07-25T00:22:14.607 回答