在Keras训练期间打印层输出

12

我是 Keras 的新手。在训练阶段,我想打印出层的输出,包括中间输出和最终输出,来调试我的神经网络。为此,我想要在每一步中提取一个层的输入和输出。

FAQ(https://keras.io/getting-started/faq/#how-can-i-obtain-the-output-of-an-intermediate-layer)中有一种方法可以提取中间层的输出以构建另一个模型,但这不是我想要的。我不需要将中间层的输出作为其他层的输入,我只需要打印它们的值,并且可能画图/制表/可视化等方式呈现。

我使用的是 Keras 2.1.4 版本。


这并不允许您深入了解单个层,但如果您的基本兴趣是弄清楚模型正在做什么,请查看 https://github.com/raghakot/keras-vis - Allyl Isocyanate
谢谢,我会去看看的 =] - Eric
2个回答

5
我认为我已经找到了一个答案,虽然不是严格由Keras完成。
基本上,要在训练期间访问层输出,需要通过添加打印节点来修改计算图。
更详细的描述可以在这个StackOverflow问题中找到:
如何在TensorFlow和Keras中打印损失函数的中间变量? 我在这里引用一个例子,比如说你想每步打印出你的损失,你需要将你的自定义损失函数设置为:
对于Theano后端:
diff = y_pred - y_true
diff = theano.printing.Print('shape of diff', attrs=['shape'])(diff)
return K.square(diff)

对于Tensorflow后端:

diff = y_pred - y_true
diff = tf.Print(diff, [tf.shape(diff)])
return K.square(diff)

其他层的输出可以类似地访问。

Google还有一个关于使用tf.Print()的不错的教程
在TensorFlow中使用tf.Print()


tf.Print现在已经被弃用。 - nbro

1
如果您想了解每个神经元的更多信息,您需要使用以下内容来获取它们的偏置和权重。
weights = model.layers[0].get_weights()[0]
biases = model.layers[0].get_weights()[1]

0索引定义权重,1索引定义偏差。

您也可以获取每层的信息,

for layer in model.layers:
    weights = layer.get_weights() # list of numpy arrays

每次训练后,如果您可以使用其维度访问每个层,并将权重和偏差获取到numpy数组中,则应该能够可视化每次训练后的神经元。

希望能对您有所帮助。


谢谢您的帮助,我能以这种方式获取每步的层输出吗?还是只有在完整训练后才能访问? - Eric
您可以在任何时候访问层详细信息,无论是在训练之前、训练期间还是训练完成后。 - Kannaiyan
非常抱歉,因为我找到的解决方案已经很好用了,所以我还没有时间将你的代码集成到我的项目中。我相信你的建议可能会更好,因为它是使用keras库而不是直接使用后端实现的。您介意提供一个示例,说明如何在训练过程中每一步打印图层输出吗?然后我就可以快速测试并将您的答案标记为正确了。 - Eric

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接