0

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

使用形状分配张量时出现 OOM[25088,4096]

网络有这样的结构:

在此处输入图像描述

我从这个站点获取这个tensorflow 预训练的 vgg 实现 代码

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

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 使用更少的内存。

4

1 回答 1

1

如果没有后向传递(“在不最小化的情况下提供值”),TensorFlow 可以立即取消分配中间激活。对于后向传递,图形具有巨大的 U 形,其中来自前向传递的激活需要保存在内存中以用于后向传递。有一些技巧(例如交换到主机内存),但总的来说,反向传播意味着内存使用率会更高。

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

如果您需要更大的批量大小并且无法降低图像分辨率或模型大小,那么使用SyncReplicasOptimizer之类的工具组合来自多个工作器/GPU 的梯度可能是一个不错的选择。查看与该模型相关的论文,看起来他们正在 4 个 GPU 上进行训练,每个 GPU 具有 12GB 内存。

于 2017-04-18T16:43:39.677 回答