我想实现的是计算交叉熵相对于输入值x
的梯度。在TensorFlow中我对此没有遇到任何问题:
ce_grad = tf.gradients(cross_entropy, x)
但是随着我的网络越来越大,我转而使用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>
和x
:
x = tf.placeholder(tf.float32, shape = [None,784])<tf.Tensor 'Placeholder:0' shape=(?, 784) dtype=float32>
回答:
我们可以编写一个后端函数来实现这一点。我们使用K.categorical_crossentropy
来计算损失,并使用K.gradients
来计算相对于模型输入的其梯度:
from keras import backend as K# 用于输入标签的输入层y_true = Input(shape=labels_shape)# 根据模型的输出和真实标签计算损失ce = K.mean(K.categorical_crossentropy(y_true, model.output))# 计算损失相对于输入的梯度grad_ce = K.gradients(ce, model.inputs)# 创建一个函数以便能够运行这个计算图func = K.function(model.inputs + [y_true], grad_ce)# 使用方法output = func([model_input_array(s), true_labels])