在Keras 2中获取每个图层的渐变

时间:2020-02-05 19:52:41

标签: tensorflow keras tensorflow2.0 keras-2

好几天以来,我一直在努力仅在Keras2的调试模式下查看图层的渐变。不用说,我已经尝试过以下代码:

import Keras.backend as K
gradients = K.gradients(model.output, model.input)
sess = tf.compat.v1.keras.backend.get_session()
evaluated_gradients = sess.run(gradients, feed_dict={model.input:images})

evaluated_gradients = sess.run(gradients, feed_dict{model.input.experimantal_ref():images})

with tf.compat.v1.Session(graph=tf.compat.v1.keras.backend.get_default_graph())

或使用

的类似方法

tf.compat.v1

所有这些都导致以下错误:

RuntimeError:“会话”图为空。向图形添加操作 在调用run()之前。

我认为这应该是任何深度学习软件包都可以提供的最基本的工具,奇怪的是,为什么在Keras2中似乎没有简单的方法可以做到这一点。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您可以尝试在eager模式下在TF 2上执行此操作。

请注意,您需要为所有内容使用tf.keras,包括模型,图层等。为此,您永远不能单独使用keras,它必须为tf.keras。例如,这意味着使用tf.keras.layers.Densetf.keras.models.Sequential等。

input_images_tensor = tf.constant(input_images_numpy)
with tf.GradientTape() as g:
    g.watch(input_images_tensor)
    output_tensor = model(input_images_tensor)

gradients = g.gradient(output_tensor, input_images_tensor)

如果要使用同一卷磁带多次计算梯度,则需要将磁带设置为persistent=True,并在获得梯度后手动将其删除。 (请参阅下面的链接的详细信息)

您可以获取有关任何“可训练”重量的梯度,而无需使用watch。如果要获得关于不可训练的张量(例如输入图像)的梯度,则必须为每个这些变量调用g.watch,如上所述。

有关GradientTape的更多详细信息:https://www.tensorflow.org/api_docs/python/tf/GradientTape