tensorflow - 如何在训练相同的 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 问题。
解决方案
推荐阅读
- angularjs - E/configParser - 错误消息:配置文件 cli.js 没有导出配置对象
- php - 从 php 类中按名称删除方法(不在运行时)
- multi-tenant - 为注册用户自动创建领域
- java - 使用 removeAll() 或其他东西来比较两个列表
- iterator - 如何在 Rust 中迭代返回 Futures 的函数 Vec?
- r - 如何解释提示结果图?
- gcc - Autotools:GCC 的 Makefile.in 有一个错误(7.3.0 和更早版本)。如何重新编程 automake 以找到“ar”和“objdump”
- json - Rest API -> 将 json 字符串作为参数值传递
- python - 如何使用 OpenCV 将图像分割成行和列?
- vba - 当行数改变时使用 worksheet_calculate