首页 > 解决方案 > 如何在训练相同的 Keras 模型时打印模型每一层的激活?

问题描述

以下代码(基于https://keras.io/getting-started/faq/#how-can-i-obtain-the-output-of-an-intermediate-layer)允许我们打印中间层的输出模型的层,给定一些我们需要提供的输入。具体来说,在这个例子中,我正在打印 layer 的输出dense,给定 layer 的输入input_1,这也恰好是我模型的输入层(但这不必是那样的)。

import numpy as np
import tensorflow as tf


def get_model():
    inp = tf.keras.layers.Input(shape=(1,))
    x = tf.keras.layers.Dense(8)(inp)
    x = tf.keras.layers.Dense(16)(x)
    out = tf.keras.layers.Dense(1)(x)
    model = tf.keras.Model(inputs=inp, outputs=out)
    model.summary()
    return model


def train():
    my_model = get_model()
    my_model.compile(optimizer="adam", loss="mse")

    get_layer_output = tf.keras.backend.function([my_model.get_layer("input_1").input],
                                                 [my_model.get_layer("dense").output])

    data_x = np.array([[1], [2], [3], [4]])
    layer_output = get_layer_output(data_x)[0]
    print(layer_output)


if __name__ == '__main__':
    train()

但是,我想打印每一层的输出,给定相应的前一层的输出(由模型定义),同时训练模型,即在每个小批量之后。我尝试使用回调,它要求tf.print打印模型的输出,但我收到了一个错误,在这个 Github 问题中描述了(即 TensorFlow 2.0 中有一个错误,这是我正在使用的版本,并且我想用)。

更清楚地说,我想在训练模型时调试每一层的输出,这样我就可以了解输入如何在每一层中流动,以及激活是不是太高(爆炸)或太小(消失) . 我可以迭代地向 提供一批数据get_layer_output,但我希望能够在使用fit或训练模型时打印每一层的激活fit_generator。此外,我想了解激活的值如何从输入层演变到输出层,而不仅仅是在给定输入到另一层的情况下打印一层的激活。

这是一个问类似问题的 Github 问题。

标签: tensorflowkeras

解决方案


推荐阅读