2017-06-24 25 views
0

backpropagating我有一個簡單的網絡定義如下:問題,同時通過在sparse_tensor_dense_multiply 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}) 

其中X是形狀[N, 1000]YsparseTensor是形狀的張量[N, 500]

我得到一個錯誤說:

OOM時分配具有形狀的張量[3684773,200]。

這正在計算W的梯度時發生。 3684773也恰好是X中非零元素的個數。

注:

  1. 當我計算使用tf.gradients梯度,它們完全 做工精細。
  2. 當我使用密集的X和密集的multiply(tf.matmul)運行相同的網絡時,它工作得很好。

回答

0

也許我有點晚,以幫助你,但你面臨的問題是,你沒有足夠的內存來分配梯度的張量。假設你正在使用32位浮點數,這張張將需要〜2.8 GB的內存,這對於顯卡來說是相當多的。我看到的唯一的解決辦法是使用

with tf.device("/cpu:0"): 
    # your code 

引腳一切CPU內存但你應該期待一個大的性能損失。