Как вызвать model.evaluate () в обратном вызове keras? - PullRequest
0 голосов
/ 06 апреля 2019

Короткая история: я строю Автоэнкодер и хотел бы хранить восстановленные изображения по ходу обучения.Я сделал пользовательский обратный вызов, который записывает изображения в резюме.Осталось только назвать слой реконструкции внутри 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

1 Ответ

1 голос
/ 06 апреля 2019

Если это последний слой в вашей модели (т.е. выходной слой), то вы можете просто вызвать 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: Как я могу получить вывод промежуточного слоя?

...