【问题标题】:Getting Gradients of Each Layer in Keras 2在 Keras 2 中获取每一层的渐变
【发布时间】:2020-02-05 19:52:41
【问题描述】:

这几天我一直在努力在 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 中似乎没有简单的方法来做到这一点。有什么想法吗?

【问题讨论】:

  • 您正在混合kerastf.keras,这通常不起作用。选择两者之一并坚持下去。
  • @DanielMöller 但单独的 keras2 也没有 set_session ,它不允许我看到张量的内部。我应该怎么做?
  • 然后选择tf.keras而不是keras
  • 如果您正在查看带有数据的张量(开启急切模式),那么您不需要接触会话,只需直接使用 tf.keras.gradients。你也可以试试渐变胶带。此自定义训练循环中有磁带示例:tensorflow.org/tutorials/customization/…

标签: tensorflow keras tensorflow2.0 keras-2


【解决方案1】:

您可以尝试在 TF 2 上开启 Eager 模式。

请注意,您需要将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)。

更多详情GradientTapehttps://www.tensorflow.org/api_docs/python/tf/GradientTape

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-28
    • 1970-01-01
    • 2020-01-05
    • 2018-12-10
    • 1970-01-01
    • 1970-01-01
    • 2017-06-02
    • 1970-01-01
    相关资源
    最近更新 更多