python - Tensorflow:从输入到输出的梯度计算

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

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

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/

相关文章:

python - 运行 import tensorflow 后的非法指令(核心转储)

machine-learning - Weka Experimenter 'Class attribute is not nominal' 但数据是从 Explorer 处理的

machine-learning - 为什么我的带有 ReLU 的 1 隐藏层神经网络在 notMNIST 数据集上的准确率没有超过 18%?

text - 需要体育、娱乐、健康等类别以及所有子类别的训练数据

python - 在 Django 中非规范化数据的最佳方法?

python - 如何使用正则表达式从字符串中提取特定类型的数字?

python - 如何正确使用__setattr__,避免无限递归

python - Flask 返回多个变量?

python-3.x - AttributeError:模块 'tensorflow.python.estimator.estimator_lib' 没有属性 'LinearRegressor'

python - Tensorflow:准备输入数据