我有一个简单的网络定义如下:
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})
其中X
为sparseTensor
形[N, 1000]
而Y
为形状张量[N, 500]
我收到错误说:
在分配形状的张量时使用OOM [3684773,200]。
正在计算W
的渐变时发生这种情况。 3684773也恰好是X
中的非零元素数。
注意:
tf.gradients
计算渐变时,它们完全可以工作
细。X
和密集multiply( tf.matmul )
运行相同的网络时,它完全正常。答案 0 :(得分:0)
也许我帮助你的时间有点晚了,但是你面临的问题是你没有足够的内存来为渐变分配张量。假设你正在使用32位浮点数,这个张量需要大约2.8 GB的内存,这对于显卡来说是相当多的。我看到的唯一解决方案是使用
将所有内容固定到CPU内存with tf.device("/cpu:0"):
# your code
但是你应该期待很大的性能损失。