gpt4 book ai didi

python - Tensorflow:链接 tf.gather() 产生 IndexedSlices 警告

转载 作者:行者123 更新时间:2023-11-28 20:39:08 25 4
gpt4 key购买 nike

我遇到了链接 tf.gather() 索引产生以下警告的问题:

/usr/local/lib/python3.5/dist-packages/tensorflow/python/ops/gradients.py:90: UserWarning: Converting sparse IndexedSlices to a dense Tensor of unknown shape. This may consume a large amount of memory.           
"Converting sparse IndexedSlices to a dense Tensor of unknown shape. "

当一层索引到输入层,对相应的切片执行一些操作,然后下一层索引到结果时,就会出现这种情况。这是一个有代表性的例子:

import tensorflow as tf

## 10-Dimensional data will be fed to the model
X = tf.placeholder( tf.float32, [10, None] )

## W works with the first 3 features of a sample
W = tf.Variable( tf.ones( [5, 3] ) )
Xi = tf.gather( X, [0,1,2] )
mm = tf.matmul( W, Xi )

## Indexing into the result produces a warning during backprop
h = tf.gather( mm, [0,1] )
...
train_step = tf.train.AdamOptimizer(1e-4).minimize( loss )

警告在定义 train_step 时出现,并在第二个 tf.gather() 调用被取消时消失。如果为 X 提供了明确数量的样本(例如,[10, 1000]),警告也会消失。

想法?

最佳答案

渐变function tf.gather 操作返回 IndexedSlices 类型的值。在您的程序中,输入的第二个 tf.gathertf.matmul (mm) 的结果。因此,矩阵乘法的梯度函数传递了一个 IndexedSlices 值。

现在,想象一下 tf.matmul 的梯度函数需要做什么。要计算梯度 w.r.t W,它必须将传入的梯度乘以 Xi 的转置。在这种情况下,传入的梯度是 IndexedSlices 类型,而 Xi 的转置是密集张量 (Tensor) 类型。 TensorFlow 没有可以对 IndexedSlicesTensor 进行操作的矩阵乘法实现。因此它只是在调用 tf.matmul 之前将 IndexedSlices 转换为 Tensor

如果您查看该转换函数的代码 here ,您会注意到,当这种稀疏到密集的转换可能导致非常大的密集张量(_LARGE_SPARSE_NUM_ELEMENTS 确定有多大)或未知大小的密集张量时,它会打印出警告。当您使用形状 [10, None] 塑造占位符 X 时,此转换发生在形状未知的 IndexedSlices 上(实际上,只有一个尺寸未知,但仍然无法静态确定生成的形状),因此您会看到打印出的警告。将 X 的形状设置为 [10, 1000] 后,IndexedSlices 的形状将完全指定,AND 生成的密集张量大小在阈值内,因此您看不到打印出的警告。

对于您的计算,如果您根本无法避免 tf.matmul 结果上的 tf.gather,那么我会非常担心这个警告,除非X 中的列数非常大。

关于python - Tensorflow:链接 tf.gather() 产生 IndexedSlices 警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39111373/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com