获取关于 Keras ANN 模型中输入的梯度

Posted

技术标签:

【中文标题】获取关于 Keras ANN 模型中输入的梯度【英文标题】:Get gradients with respect to inputs in Keras ANN model 【发布时间】:2020-09-10 02:41:10 【问题描述】:
bce = tf.keras.losses.BinaryCrossentropy()
ll=bce(y_test[0], model.predict(X_test[0].reshape(1,-1)))
print(ll)
<tf.Tensor: shape=(), dtype=float32, numpy=0.04165391>
print(model.input)
<tf.Tensor 'dense_1_input:0' shape=(None, 195) dtype=float32>
model.output
<tf.Tensor 'dense_3/Sigmoid:0' shape=(None, 1) dtype=float32>
grads=K.gradients(ll, model.input)[0]
print(grads)
None

所以我在这里训练了一个 2 个隐藏层的神经网络,输入有 195 个特征,输出是 1 个大小。我想用 y_test 中的正确标签一个一个地为神经网络提供名为 X_test 的验证实例,并为每个实例计算输出相对于输入的梯度,打印时的毕业生给我一个无。感谢您的帮助。

【问题讨论】:

这能回答你的问题吗? How to obtain the gradients in keras? 【参考方案1】:

可以使用tf.GradientTape 完成此操作。我编写了以下代码来学习正弦波,并本着this question 的精神得到它的导数。我认为,应该可以扩展以下代码以计算偏导数。 导入所需的库:

import numpy as np
from tensorflow.keras.layers import Dense, Input
from tensorflow.keras.models import Model, Sequential
from tensorflow.keras.optimizers import Adam
from tensorflow.keras import losses
import tensorflow as tf

创建数据:

x = np.linspace(0, 6*np.pi, 2000)
y = np.sin(x)

定义一个 Keras NN:

def model_gen(Input_shape):
    X_input = Input(shape=Input_shape)
    X = Dense(units=64, activation='sigmoid')(X_input)
    X = Dense(units=64, activation='sigmoid')(X)
    X = Dense(units=1)(X)
    model = Model(inputs=X_input, outputs=X)
    return model

训练模型:

model = model_gen(Input_shape=(1,))
opt = Adam(lr=0.01, beta_1=0.9, beta_2=0.999, decay=0.001)
model.compile(loss=losses.mean_squared_error, optimizer=opt)
model.fit(x,y, epochs=200)

获得网络w.r.t的梯度。输入:

x = list(x)
x = tf.constant(x)
with tf.GradientTape() as t:
  t.watch(x)
  y = model(x)

dy_dx = t.gradient(y, x)

dy_dx.numpy()

可以进一步可视化 dy_dx 以确保导数的平滑程度。最后,请注意,当使用平滑激活(例如 sigmoid)而不是 here 中提到的 Relu 时,会得到更平滑的导数。

【讨论】:

嗨,我完全尝试了使用 Tf1 和 2 编写的内容。但是,我遇到了错误。对于 Tf1,我的错误是: ValueError: Input 0 of layer dense_18 is in compatible with the layer: : expected min_ndim=2, found ndim=1.收到的完整形状:[2000]。在 TF2 中,我的错误是:InvalidArgumentError: In[0] is not a matrix。相反,它的形状为 [2000] [Op:MatMul]。顺便说一句,错误发生在 y = model(x) 处。有人可以解释为什么以及解决方案是什么吗?谢谢。

以上是关于获取关于 Keras ANN 模型中输入的梯度的主要内容,如果未能解决你的问题,请参考以下文章

使用 Keras 获取模型输出 w.r.t 权重的梯度

让 Keras / Tensorflow 输出 OneHotCategorical,但操作没有梯度

收藏 | 用 Keras 实现神经网络来解决梯度消失的问题

在 keras(tensorflow 后端)中计算梯度时出错

Keras 中的自定义损失函数(IoU 损失函数)和梯度误差?

Keras 中的策略梯度