【问题标题】:How to call model.evaluate() in keras callback?如何在 keras 回调中调用 model.evaluate()?
【发布时间】:2019-04-06 08:58:41
【问题描述】:

简短的故事:我正在构建一个自动编码器,并希望在训练过程中存储重建的图像。我做了一个自定义回调,将图像写入摘要。唯一剩下的就是在callback.on_epoch_end(...) 中调用我的重建层。如何访问回调中的命名层并运行计算?

图层定义:

decode = layers.Conv2D(1, (5, 5), name='wwae_decode', activation='sigmoid', padding='same')(conv3)

回调定义:

class TensorBoardImage(tf.keras.callbacks.Callback):
    def __init__(self, tag, logdir):
        super().__init__()
        self.tag = tag
        self.logdir = logdir

    def on_epoch_end(self, epoch, logs={}):
        img_stack = self.validation_data[0][:3]
        # TODO: run img_stack through 'wwae_decode' layer first
        # img_stack = self?model?get_layer('wwae_decode').evaluate(img_stack) # ????
        single_image = merge_axis(img_stack, target_axis=2)
        summary_str = []
        single_image = (255 * single_image).astype('uint8')
        summary_str.append(tf.Summary.Value(tag=self.tag, image=make_image(single_image)))
            # multiple summaries can be appended
        writer = tf.summary.FileWriter(self.logdir)
        writer.add_summary(tf.Summary(value=summary_str), epoch)
        return

【问题讨论】:

  • 假设您正在构建一个自动编码器,那么这一定是您模型中的最后一层,对吧?

标签: python tensorflow keras callback autoencoder


【解决方案1】:

如果这是模型中的最后一层(即输出层),那么您可以在回调中简单地调用模型实例的predict 方法:

# ...
img_stack = self.validation_data[0][:3]
preds_img_stack = self.model.predict(img_stack)
# ...

或者,您可以通过定义后端函数直接计算层的输出:

from keras import backend as K

func = K.function(model.inputs + [K.learning_phase()], [model.get_layer('wwae_decode').output])

# ...
img_stack = self.validation_data[0][:3]
preds_img_stack = func([img_stack, 0])[0]
# ...

更多信息,建议您阅读 Keras FAQ 中的相关部分:How can I obtain the output of an intermediate layer?

【讨论】:

  • 我有多个输出,但我可以从这里获取它
  • @y.selivonchyk 查看我的更新答案以获取替代解决方案。
猜你喜欢
  • 2021-01-10
  • 2018-12-20
  • 1970-01-01
  • 2021-06-17
  • 2017-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多