我有一个具有二维输出(二进制分类)的keras模型。
model.output # <tf.Tensor 'dense_1_3/MatMul:0' shape=(?, 2) dtype=float32>
和
model.input # <tf.Tensor 'bidirectional_1_input:0' shape=(?, ?, 200) dtype=float32>
对于某些形状为(1,50,200)的示例输入,我评估了三种不同的梯度
gradients0 = K.gradients(model.output[:,0] model.inputs)
gradients1 = K.gradients(model.output[:,1], model.inputs)
gradients2 = K.gradients(model.output, model.inputs)
我认为,前两个表达式产生单个输出神经元的梯度,最后一个表达式产生包含前两个表达式的张量。
令我惊讶的是,所有三个渐变的形状均为(1,50,200)
。在我看来,由于(2,50,200)
是二维的,所以渐变2的形状必须为model.output
。在这种情况下,keras计算是什么?
答案 0 :(得分:1)
Keras.backend.gradients()期望输出是标量函数,而不是多维函数。我通过一个小示例发现K.gradients()的执行效果与tf.gradients()相同。这样(如此处https://www.tensorflow.org/api_docs/python/tf/gradients所示),您的 gradients2 返回长度为len(xs)的张量的列表,其中每个张量是的总和(dy / dx) y in ys ,这解释了为什么第一个形状尺寸是1而不是2。
此链接可以为您提供帮助:Tensorflow gradient with respect to matrix