【问题标题】:fine tuning vgg raise memory error微调 vgg 引发内存错误
【发布时间】:2017-04-16 13:31:51
【问题描述】:

您好,我正在尝试对 vgg 进行微调以解决我的问题,但是当我尝试训练网络时出现此错误。

用形状分配张量时的OOM[25088,4096]

网络有这样的结构:

我从这个 site 中获取这个 tensorflow 预训练 vgg 实现 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)?

更新: 如果我使用 GradientDescentOptimizer 训练过程开始,而不是如果我使用 AdamOptimizer 我得到内存错误,似乎GradientDescentOptimizer 使用更少的内存。

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2018-11-26
      • 2018-07-25
      • 1970-01-01
      • 2017-04-30
      • 2019-06-16
      • 2015-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多