2017-04-16 77 views
0

嗨,我想微調vgg對我的問題,但是當我嘗試訓練網絡我得到這個錯誤。微調vgg提高內存錯誤

OOM分配與形狀張量時[25088,4096]

淨具有這種結構:

enter image description here

我藉此tensorflow預訓練VGG實施code從這個site

我只添加這個過程訓練網絡:

with tf.name_scope('joint_loss'): 
    joint_loss = ya_loss+yb_loss+yc_loss+yd_loss+ye_loss+yf_loss+yg_loss+yh_loss+yi_loss+yl_loss+ym_loss+yn_loss 

    # Loss with weight decay 
    l2_loss = tf.add_n([tf.nn.l2_loss(v) for v in tf.trainable_variables()]) 
    self.joint_loss = joint_loss + self.weights_decay * l2_loss 
    self.optimizer = tf.train.AdamOptimizer(learning_rate=self.learning_rate).minimize(joint_loss) 

我嘗試了批量大小減少到2而不是工作,我得到了同樣的錯誤。錯誤是由於無法在內存中分配的大張量引起的。如果我在沒有最小化網絡作品的情況下提供一個值,我只在火車上得到這個錯誤。我怎樣才能避免這個錯誤?我如何節省顯卡的內存(Nvidia GeForce GTX 970)?

UPDATE:如果我使用GradientDescentOptimizer訓練過程的開始,而不是如果我使用AdamOptimizer我得到的內存錯誤,似乎GradientDescentOptimizer使用較少的內存。

回答

1

如果沒有向後傳遞(「饋送一個值而不會最小化」),TensorFlow可以立即取消分配中間激活。在向後傳球的情況下,該圖形具有巨大的U形形狀,其中來自正向傳球的激活需要留在回傳的記憶中。有一些技巧(如swapping to host memory),但通常backprop意味着內存使用率會更高。

Adam確實保留了一些額外的簿記變量,所以它會增加內存使用量,與您的權重變量已經使用的內存量成比例。如果您的訓練步驟需要很長時間(在GPU上進行可變更新並不重要),則可以在主機內存中找到優化操作。

如果您需要更大的批量大小,並且不能降低圖像分辨率或模型大小,則使用類似SyncReplicasOptimizer這樣的多個工作人員/ GPU的梯度組合可能是一個不錯的選擇。看看與這個模型相關的論文,看起來他們在4個GPU上訓練,每個GPU都有12GB內存。