Tensorflow 根据权重计算输出的梯度

Tensorflow 根据权重计算输出的梯度,tensorflow,machine-learning,gradient,tensorflow2.0,automatic-differentiation,Tensorflow,Machine Learning,Gradient,Tensorflow2.0,Automatic Differentiation,从tensorflow模型开始,我希望能够检索输出相对于权重的梯度。反向传播的目的是计算权重的损失梯度,为了做到这一点,必须在代码中的某个地方计算权重的输出梯度 但是我想知道如何在API级别得到这个雅可比矩阵,有什么想法吗 我知道我们可以使用磁带,但我不知道该怎么做,实际上我不需要整个雅可比矩阵,我只需要能够计算J^{*}v的矩阵向量积,其中J^{}是雅可比矩阵和给定向量的转置 谢谢,, 注意。如果您只需要计算向量雅可比积,那么只计算向量雅可比积比计算完整雅可比积要高效得多。计算N个变量函数的雅

从tensorflow模型开始,我希望能够检索输出相对于权重的梯度。反向传播的目的是计算权重的损失梯度,为了做到这一点,必须在代码中的某个地方计算权重的输出梯度

但是我想知道如何在API级别得到这个雅可比矩阵,有什么想法吗

我知道我们可以使用磁带,但我不知道该怎么做,实际上我不需要整个雅可比矩阵,我只需要能够计算J^{*}v的矩阵向量积,其中J^{}是雅可比矩阵和给定向量的转置

谢谢,,
注意。

如果您只需要计算向量雅可比积,那么只计算向量雅可比积比计算完整雅可比积要高效得多。计算N个变量函数的雅可比矩阵将花费O(N)个时间,而向量雅可比矩阵乘积的计算时间为O(1)

那么如何计算张量流中的向量雅可比积呢?诀窍是在
gradient
函数中使用
output\u gradients
关键字arg。将
output_gradients
的值设置为向量雅可比积中的向量。让我们看一个例子

import tensorflow as tf

with tf.GradientTape() as g:  
    x  = tf.constant([1.0, 2.0])  
    g.watch(x)  
    y = x*x # y is a length 2 vector

vec = tf.constant([2.0,3.0]) # vector in vector jacobian product

grad = g.gradient(y,x,output_gradients = vec)
print(grad) # prints the vector-jacobian product, [4.,12.]
注意:如果您试图在tensorflow中计算向量值(而非标量)函数的梯度,而不设置
输出梯度
,它将计算向量雅可比积,其中向量设置为全1。比如说,

import tensorflow as tf

with tf.GradientTape() as g:  
    x  = tf.constant([1.0, 2.0])  
    g.watch(x)  
    y = x*x # y is a length 2 vector

grad = g.gradient(y,x)
print(grad) # prints the vector-jacobian product with a vector of ones, [2.0,4.0]

我不确定你到底想做什么,但在TensorFlow 2.0中,你可以使用梯度带来获得,它为每个源值提供聚合梯度(比如雅可比矩阵中每列的总和),或者,它实际为你提供雅可比矩阵。