在tensorflow中通过sparse_tensor_dense_multiply反向传播时发出问题

时间:2017-06-24 18:05:33

标签: python tensorflow

我有一个简单的网络定义如下:

h1 = tf.sparse_tensor_dense_matmul(x, W1)
h2 = tf.matmul(h1, W2)
y = tf.matmul(h2, W3)
loss = tf.nn.l2_loss(y - y_)
train = tf.train.AdamOptimizer(learning_rate=lr).minimize(loss)

其中x是sparseTensor,其余部分是密集的。

W1的尺寸(形状)= [1000,200],W2 = [200,400],W3 = [400, 500]

当我运行以下内容时:

sess.run([train], feed_dict={x:X, y_:Y})

其中XsparseTensor[N, 1000]Y为形状张量[N, 500]

我收到错误说:

  

在分配形状的张量时使用OOM [3684773,200]。

正在计算W的渐变时发生这种情况。 3684773也恰好是X中的非零元素数。

注意:

  1. 当我使用tf.gradients计算渐变时,它们完全可以工作 细。
  2. 当我使用密集X和密集multiply( tf.matmul )运行相同的网络时,它完全正常。

1 个答案:

答案 0 :(得分:0)

也许我帮助你的时间有点晚了,但是你面临的问题是你没有足够的内存来为渐变分配张量。假设你正在使用32位浮点数,这个张量需要大约2.8 GB的内存,这对于显卡来说是相当多的。我看到的唯一解决方案是使用

将所有内容固定到CPU内存
with tf.device("/cpu:0"):
    # your code

但是你应该期待很大的性能损失。