【问题标题】:Tensorflow: Gradient Calculation from Input to OutputTensorflow:从输入到输出的梯度计算
【发布时间】:2017-08-14 10:38:23
【问题描述】:

我想计算神经网络输出相对于输入的梯度。我有以下张量:

Input: (num_timesteps, features)

Output: (num_timesteps, 1)

对于从输入到整个输出向量的梯度,我可以使用以下方法:

tf.gradients(Output, Input)

因为我想计算我想计算的每个时间样本的梯度

tf.gradients(Output[i], Input)

对于每个i

最好的方法是什么?

【问题讨论】:

    标签: python tensorflow machine-learning artificial-intelligence tensorflow-gradient


    【解决方案1】:

    首先,我想你的意思是Output 相对于 Input 的梯度。

    现在,这两个电话的the result

    • dO = tf.gradients(Output, Input)
    • dO_i = tf.gradients(Output[i], Input)(适用于任何有效的i

    将是一个包含单个元素的列表 - 一个与Input 具有相同形状 的张量,即[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.]]
    

    所有行都将是0,除了i-th 。所以只要计算一个矩阵dO,你就可以很容易地得到每一个dO_i。这非常有效。

    但是,如果这不是您的情况,并且所有 Output[i] 都依赖于所有输入,则无法仅从它们的总和中提取单个 dO_i。除了分别计算每个梯度之外,您别无选择:只需遍历 i 并执行 tf.gradients

    【讨论】:

      猜你喜欢
      • 2020-03-27
      • 1970-01-01
      • 2020-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-01
      • 1970-01-01
      • 2015-05-09
      相关资源
      最近更新 更多