微调vgg引起内存错误

时间:2017-04-16 13:31:52

标签: python-2.7 tensorflow conv-neural-network vgg-net

您好我正在尝试对我的问题进行微调 vgg ,但是当我尝试训练网时,我得到了这个错误。

分配张量形状[25088,4096]

时,

OOM

网有这种结构:

enter image description here

我从此code获取 tensorflow预训练vgg实现 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 )?

更新:如果我使用 GradientDescentOptimizer 启动培训流程,相反,如果我使用 AdamOptimizer 我得到内存错误,似乎是GradientDescentOptimizer使用更少的内存。

1 个答案:

答案 0 :(得分:1)

没有向后传递("在没有最小化&#34的情况下提供值;),TensorFlow可以立即取消分配中间激活。通过向后传球,图形具有巨大的U形,其中来自前向传球的激活需要保持在存储器中以用于向后传球。有一些技巧(例如swapping to host memory),但一般来说,backprop意味着内存使用率会更高。

Adam确实会保留一些额外的簿记变量,因此它会增加与重量变量已经使用的内存量成比例的内存使用量。如果您的训练步骤需要很长时间(在这种情况下,GPU上的变量更新并不重要),您可以将优化操作定位在主机内存中。

如果您需要更大的批量大小且无法降低图像分辨率或模型大小,则使用SyncReplicasOptimizer之类的方法组合来自多个工作人员/ GPU的渐变可能是一个不错的选择。看看与这个模型相关的论文,看起来他们正在训练4个GPU,每个都有12GB的内存。