python - 为什么 Tensorflow 无法计算 reshape 参数的梯度?

标签 python tensorflow deep-learning gradient

我想计算所有网络参数的损失梯度。当我尝试 reshape 每个权重矩阵以使其成为一维时,问题就出现了(这对我稍后使用梯度进行的计算很有用)。

此时 Tensorflow 输出一个 None 列表(这意味着没有从损失到这些张量的路径,而应该有,因为它们是 reshape 的模型参数)。

代码如下:

all_tensors = list()
for dir in ["fw", "bw"]:
    for mtype in ["kernel"]:
        t = tf.get_default_graph().get_tensor_by_name("encoder/bidirectional_rnn/%s/lstm_cell/%s:0" % (dir, mtype))
        all_tensors.append(t)
        # classifier tensors:
    for mtype in ["kernel", "bias"]:
        t = tf.get_default_graph().get_tensor_by_name("encoder/dense/%s:0" % (mtype))
        all_tensors.append(t)
all_tensors = [tf.reshape(x, [-1]) for x in all_tensors]
tf.gradients(self.loss, all_tensors)

all_tensor 在 for 循环的末尾是一个包含 4 个组件的列表,这些组件具有不同形状的矩阵。此代码输出 [None, None, None, None]。 如果我删除 reshape 线 all_tensors = [tf.reshape(x, [-1]) for x in all_tensors] 该代码工作正常并返回 4 个张量,其中包含每个参数的梯度。

为什么会这样?我很确定 reshape 不会破坏图中的任何依赖关系,否则它根本无法在任何网络中使用。

最佳答案

好吧,事实是没有从张量到损失的路径。如果您想到 TensorFlow 中的计算图,self.loss 是通过一系列操作定义的,这些操作有时会使用您感兴趣的张量。但是,当您这样做时:

all_tensors = [tf.reshape(x, [-1]) for x in all_tensors]

您正在图中创建新节点和未被任何人使用的新张量。是的,这些张量和损失值之间存在关系,但从 TensorFlow 的角度来看, reshape 是一个独立的计算。

如果你想做类似的事情,你必须先进行 reshape ,然后使用 reshape 后的张量计算损失。或者,您也可以只计算相对于原始张量的梯度,然后 reshape 结果。

关于python - 为什么 Tensorflow 无法计算 reshape 参数的梯度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52201565/

相关文章:

python - 通过 POST 请求返回列表

python - 创建流程树形式的 json 文件。在Python中

python - 计算另一个列表元素指定范围内列表中元素数量的更快方法

python - 进程之间的数据共享问题

python - pip install tensorflow 找不到名为 client_load_reporting_filter.h 的文件

python - 在CPU为python2.7的Mac上安装Keras/Tensorflow

python - ValueError : Tensor ("BN_1/moments/Squeeze:0", shape=(32, 256, 32), dtype=float32) 必须来自与 Tensor 相同的图表

python - Tensorflow 表查找 int->float

file - 如何将 .npy 文件作为 numpy 数组加载到 Google Colab 上的虚拟机中

python - 如何获取微调后的 TFBertModel 的隐藏状态?