我有一个带有二维输出(二进制分类)的 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)
。在我看来,gradients2 需要有形状,(2,50,200)
因为它model.output
是二维的。在这种情况下,什么是 keras 计算?
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 梯度相对于矩阵
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句