我想计算神经网络输出相对于输入的梯度。我有以下张量:
Input: (num_timesteps, features)
Output: (num_timesteps, 1)
对于从输入到整个输出向量的梯度,我可以使用以下内容:
tf.gradients(Output, Input)
因为我想计算我想要计算的每个时间样本的梯度
tf.gradients(Output[i], Input)
对于每个i
。
最好的方法是什么?
最佳答案
首先,我想您指的是输出
相对于输入输入
的梯度。
现在,the result这两个调用的:
dO = tf.gradients(输出, 输入)
dO_i = tf.gradients(Output[i], Input)
(对于任何有效的i
)
将是一个包含单个元素的列表 - 与输入
形状相同的张量,即[num_timesteps, features]
矩阵。另外,如果将所有矩阵 dO_i
(所有有效的 i
)相加,则恰好是矩阵 dO
。
考虑到这一点,回到你的问题。在许多情况下,Input
中的各个行是独立的,这意味着 Output[i]
仅根据 Input[i]
计算,而不是不知道其他输入(典型情况:没有batchnorm的批处理)。如果您的情况如此,那么 dO
将立即为您提供所有单独的组件 dO_i
。
这是因为每个 dO_i
矩阵将如下所示:
[[ 0. 0. 0.]
[ 0. 0. 0.]
...
[ 0. 0. 0.]
[ xxx xxx xxx] <- i-th row
[ 0. 0. 0.]
...
[ 0. 0. 0.]]
除了第 i
行之外,所有行都将为 0
。因此,只需计算一个矩阵dO
,您就可以轻松获得每个dO_i
。这非常有效。
但是,如果您的情况并非如此,并且所有 Output[i]
都依赖于所有输入,则无法仅从它们的总和中提取单个 dO_i
。除了单独计算每个梯度之外,您别无选择:只需迭代 i
并执行 tf.gradients
。
关于python - Tensorflow:从输入到输出的梯度计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42949548/