首页 文章

微调vgg引发内存错误

提问于
浏览
0

嗨我正在尝试微调 vgg 我的问题,但当我尝试训练网我得到这个错误 .

OOM when allocating tensor with shape[25088,4096]

网有这种结构:

enter image description here

我从这个site中拿这个 tensorflow pretrained vgg implementation code .

我只添加这个程序来训练网:

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)

我尝试将 batch size 减少到2但不起作用我得到相同的错误 . 该错误是由于无法在内存中分配的大张量引起的 . 我只在火车中得到这个错误,如果我在没有最小化网络的情况下提供一个值 . 我怎么能避免这个错误?我怎样才能节省显卡的内存( Nvidia GeForce GTX 970 )?

UPDATE: 如果我使用 GradientDescentOptimizer 训练过程开始,相反如果我使用 AdamOptimizer 我得到内存错误,似乎GradientDescentOptimizer使用更少的内存 .

1 回答

  • 1

    如果没有向后传递("feed a value without minimizing"),TensorFlow可以立即取消分配中间激活 . 通过向后传球,图形具有巨大的U形,其中来自前向传球的激活需要保持在存储器中以用于向后传球 . 有一些技巧(例如swapping to host memory),但一般来说,backprop意味着内存使用率会更高 .

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

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

相关问题