Tensorflow密集梯度解释?

时间:2016-03-09 13:03:35

标签: tensorflow

我最近实施了一个模型,当我运行它时,我收到了这个警告:

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. "

突然有了一些类似的参数设置(嵌入维度),模型的速度非常慢。

  1. 这个警告意味着什么?看来,我所做的事情已经导致所有渐变都很密集,所以backprop正在进行密集矩阵计算
  2. 如果该模型存在导致此问题的问题,我该如何识别并修复它?

3 个答案:

答案 0 :(得分:54)

当稀疏tf.IndexedSlices对象隐式转换为密集tf.Tensor时,将打印此警告。这通常发生在一个op(通常为tf.gather())反向传播稀疏渐变时,但接收它的op没有可以处理稀疏渐变的专用渐变函数。因此,TensorFlow会自动加密tf.IndexedSlices,如果张量较大,则会对性能造成破坏性影响。

要解决此问题,您应该尝试确保params tf.gather()的输入(或tf.nn.embedding_lookup()params输入)为tf.Variable 。变量可以直接接收稀疏更新,因此不需要转换。虽然tf.gather()(和tf.nn.embedding_lookup())接受任意张量作为输入,但这可能会导致更复杂的反向传播图,从而导致隐式转换。

答案 1 :(得分:20)

密集的Tensor可以被认为是标准的python数组。稀疏的可以被认为是索引和值的集合,例如。

# dense
array = ['a', None, None, 'c']

# sparse
array = [(0, 'a'), (3, 'c')]

因为你可以看到你是否有很多空条目,稀疏数组比密集数组更有效。但如果填写所有条目,密集效率会更高。在你的情况下,在张量流图中的某个地方,稀疏数组被转换为一个不确定大小的密集数组。警告只是说你可能会浪费很多这样的记忆。但是,如果稀疏数组不是太大/已经非常密集,那么它可能根本不是问题。

如果您想要诊断它,我会建议命名您的各种张量对象,然后它将准确打印在此转换中使用的那些,您可以找出您可以调整以删除它的内容。

答案 2 :(得分:8)

完全同意mrry的答案。

实际上我会针对这个问题发布另一个解决方案。

您可以使用tf.dynamic_partition()代替tf.gather()来消除警告。

示例代码如下:

# Create the cells for the RNN network
lstm = tf.nn.rnn_cell.BasicLSTMCell(128)

# Get the output and state from dynamic rnn
output, state = tf.nn.dynamic_rnn(lstm, sequence, dtype=tf.float32, sequence_length = seqlen)

# Convert output to a tessor and reshape it
outputs = tf.reshape(tf.pack(output), [-1, lstm.output_size])

# Set partions to 2
num_partitions = 2

# The partitions argument is a tensor which is already fed to a placeholder.
# It is a 1-D tensor with the length of batch_size * max_sequence_length.
# In this partitions tensor, you need to set the last output idx for each seq to 1 and 
# others remain 0, so that the result could be separated to two parts,
# one is the last outputs and the other one is the non-last outputs.
res_out = tf.dynamic_partition(outputs, partitions, num_partitions)

# prediction
preds = tf.matmul(res_out[1], weights) + bias

希望这可以帮到你。