Tensorflow密集梯度解释?
tensorflow
4
0

我最近实现了一个模型,运行时收到以下警告:

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. 如果是导致此问题的模型存在问题,如何识别并修复它?
参考资料:
Stack Overflow
收藏
评论
共 3 个回答
高赞 时间 活跃

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

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

收藏
评论

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

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

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

因此,如您所见,如果您有很多空条目,那么稀疏数组将比密集数组效率更高。但是,如果所有条目均已填写,则密写效率要高得多。在您的情况下,张量流图中的某个稀疏数组将被转换为一个不确定大小的密集数组。警告只是说这样可能会浪费很多内存。但是,如果稀疏数组不是太大/已经很密集,那可能根本就不是问题。

如果您想诊断它,我建议您命名各种张量对象,然后它将准确打印此转换中正在使用的对象,并且您可以算出可以调整的量来删除它。

收藏
评论

完全同意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

希望这可以对您有所帮助。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号