如何计算 Keras 模型中模型输入的损失梯度?

A. *_*ski 4 python machine-learning neural-network keras tensorflow

我想要实现的是计算交叉熵相对于输入值的梯度x。在 TensorFlow 中我没有遇到任何问题:

ce_grad = tf.gradients(cross_entropy, x)
Run Code Online (Sandbox Code Playgroud)

但随着我的网络变得越来越大,我改用 Keras 来更快地构建它们。但是,现在我真的不知道如何实现上述目标?有没有办法从model存储整个模型的变量中提取交叉熵和输入张量?

为了清楚起见,我的cross_entropy是:

cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels = y_, logits=y_conv))
<tf.Tensor 'Mean:0' shape=() dtype=float32>
Run Code Online (Sandbox Code Playgroud)

x

x = tf.placeholder(tf.float32, shape = [None,784])
<tf.Tensor 'Placeholder:0' shape=(?, 784) dtype=float32>
Run Code Online (Sandbox Code Playgroud)

tod*_*day 5

我们可以编写一个后端函数来做到这一点。我们用来K.categorical_crossentropy计算损失并用来K.gradients计算其相对于模型输入的梯度:

from keras import backend as K

# an input layer to feed labels
y_true = Input(shape=labels_shape)
# compute loss based on model's output and true labels
ce = K.mean(K.categorical_crossentropy(y_true, model.output))
# compute gradient of loss with respect to inputs
grad_ce = K.gradients(ce, model.inputs)
# create a function to be able to run this computation graph
func = K.function(model.inputs + [y_true], grad_ce)

# usage
output = func([model_input_array(s), true_labels])
Run Code Online (Sandbox Code Playgroud)