如何在 Tensorflow 2.0 中计算输出 wrt 输入的梯度

mau*_*era 8 neural-network python-3.x tensorflow tensorflow2.0

我有一个训练有素的 Tensorflow 2.0 模型(来自 tf.keras.Sequential()),它采用具有 26 列 (X) 的输入层并生成具有 1 列 (Y) 的输出层。

在 TF 1.x 中,我能够计算输出相对于输入的梯度,如下所示:

model = load_model('mymodel.h5')
sess = K.get_session()
grad_func = tf.gradients(model.output, model.input)
gradients = sess.run(grad_func, feed_dict={model.input: X})[0]
Run Code Online (Sandbox Code Playgroud)

在 TF2 中,当我尝试运行 tf.gradients() 时,出现错误:

运行时错误:启用急切执行时不支持 tf.gradients。使用 tf.GradientTape 代替。

带有急切执行的 TensorFlow 2.0 中,如何计算特定层的网络输出的梯度?,我们看到了关于如何计算关于中间层的梯度的答案,但我不知道如何将其应用于关于输入的梯度。在tf.GradientTape 的 Tensorflow 帮助中,有计算简单函数梯度的示例,但没有计算神经网络的示例。

如何使用tf.GradientTape计算输出相对于输入的梯度?

Mat*_*gro 5

这应该适用于 TF2:

inp = tf.Variable(np.random.normal(size=(25, 120)), dtype=tf.float32)

with tf.GradientTape() as tape:
    preds = model(inp)

grads = tape.gradient(preds, inp)
Run Code Online (Sandbox Code Playgroud)

基本上,您的操作方式与 TF1 相同,但使用GradientTape.

  • 谢谢!这是可行的(我只需将输入形状更改为“size=(120,26)”,因为我有 26 个输入列)。关键是使用 tf.Variable() 将数据 (X) 从 numpy 转换为 tf 变量 (inp)。我尝试过 tf.convert_to_tensor(),但这不起作用。 (2认同)
  • 我不知道变量,但是 model(x) 和 model.predict(x) 不做同样的事情,predict 使用 numpy 数组,而 model(x) 执行张量流可以区分的符号计算。 (2认同)