每批Keras都会获得模型输出

时间:2018-10-02 23:32:30

标签: callback keras

我正在使用生成器为分层递归模型制作顺序训练数据,该模型需要前一批的输出来生成下一批的输入。这与Keras自变量stateful=True相似,后者保存了下一批的隐藏状态,只是它更复杂,所以我不能照常使用它。

到目前为止,我尝试过在损失函数中加入一个技巧:

def custom_loss(y_true, y_pred):
    global output_ref
    output_ref[0] = y_pred[0].eval(session=K.get_session())
    output_ref[1] = y_pred[1].eval(session=K.get_session())

但是没有编译,我希望有更好的方法。 Keras回调会有所帮助吗?

2 个答案:

答案 0 :(得分:1)

here那里学习:

model.compile(optimizer='adam')
# hack after compile
output_layers = [ 'gru' ]
s_name = 's'
model.metrics_names += [s_name]
model.metrics_tensors += [layer.output for layer in model.layers if layer.name in output_layers]

class my_callback(Callback):
    def on_batch_end(self, batch, logs=None):
        s_pred = logs[s_name]
        print('s_pred:', s_pred)
        return

model.fit(..., callbacks=[my_callback()])

答案 1 :(得分:0)

我在Keras的Tensorflow版本中使用了此功能,但它应在没有Tensorflow的Keras中使用

import tensorflow as tf

class ModelOutput:
    ''' Class wrapper for a metric that stores the output passed to it '''
    def __init__(self, name):
        self.name = name
        self.y_true = None
        self.y_pred = None

    def save_output(self, y_true, y_pred):
        self.y_true = y_true
        self.y_pred = y_pred
        return tf.constant(True)

class ModelOutputCallback(tf.keras.callbacks.Callback):
  def __init__(self, model_outputs):
    tf.keras.callbacks.Callback.__init__(self)
    self.model_outputs = model_outputs

  def on_train_batch_end(self, batch, logs=None):
    #use self.model_outputs to get the outputs here

model_outputs = [
                ModelOutput('rbox_score_map'),
                ModelOutput('rbox_shapes'),
                ModelOutput('rbox_angles')
            ]

# Note the extra [] around m.save_output, this example is for a model with 
# 3 outputs, metrics must be a list of lists if you type it out
model.compile( ..., metrics=[[m.save_output] for m in self.model_outputs])

model.fit(..., callbacks=[ModelOutputCallback(model_outputs)])