【问题标题】:Finetuning VGG-16 on GPU in Keras: memory consumption在 Keras 的 GPU 上微调 VGG-16:内存消耗
【发布时间】:2018-11-26 17:04:28
【问题描述】:

我正在为我的任务微调 VGG-16。这个想法是我加载预训练的权重,删除最后一层(这是具有 1000 个输出的 softmax)并用具有几个输出的 softmax 替换它。然后我冻结除最后一层以外的所有层并训练模型。

这是构建原始模型并加载权重的代码。

def VGG_16(weights_path=None):
    model = Sequential()
    model.add(ZeroPadding2D((1,1),input_shape=(224,224,3)))
    model.add(Conv2D(64, (3, 3), activation='relu'))
    model.add(ZeroPadding2D((1,1)))
    model.add(Conv2D(64, (3, 3), activation='relu'))
    model.add(MaxPooling2D((2,2), strides=(2,2)))

    model.add(ZeroPadding2D((1,1)))
    model.add(Conv2D(128, (3, 3), activation='relu'))
    model.add(ZeroPadding2D((1,1)))
    model.add(Conv2D(128, (3, 3), activation='relu'))
    model.add(MaxPooling2D((2,2), strides=(2,2)))

    model.add(ZeroPadding2D((1,1)))
    model.add(Conv2D(256, (3, 3), activation='relu'))
    model.add(ZeroPadding2D((1,1)))
    model.add(Conv2D(256, (3, 3), activation='relu'))
    model.add(ZeroPadding2D((1,1)))
    model.add(Conv2D(256, (3, 3), activation='relu'))
    model.add(MaxPooling2D((2,2), strides=(2,2)))

    model.add(ZeroPadding2D((1,1)))
    model.add(Conv2D(512, (3, 3), activation='relu'))
    model.add(ZeroPadding2D((1,1)))
    model.add(Conv2D(512, (3, 3), activation='relu'))
    model.add(ZeroPadding2D((1,1)))
    model.add(Conv2D(512, (3, 3), activation='relu'))
    model.add(MaxPooling2D((2,2), strides=(2,2)))

    model.add(ZeroPadding2D((1,1)))
    model.add(Conv2D(512, (3, 3), activation='relu'))
    model.add(ZeroPadding2D((1,1)))
    model.add(Conv2D(512, (3, 3), activation='relu'))
    model.add(ZeroPadding2D((1,1)))
    model.add(Conv2D(512, (3, 3), activation='relu'))
    model.add(MaxPooling2D((2,2), strides=(2,2)))

    model.add(Flatten())
    model.add(Dense(4096, activation='relu'))
    model.add(Dropout(0.5))
    model.add(Dense(4096, activation='relu'))
    model.add(Dropout(0.5))
    model.add(Dense(1000, activation='softmax'))

    if weights_path:
        model.load_weights(weights_path)

    return model

在我的案例中,Keras 使用 Tensorflow 作为后端。 Tensorflow 是为使用 GPU(使用 CUDA)而构建的。我目前有一张相当旧的卡:GTX 760,内存为 2Gb。

由于内存不足错误,我什至无法在我的卡上加载整个模型(上面的代码)。

Here作者说4Gb也不够用。

Here GTX 1070 甚至能够训练 VGG-16(不仅仅是将其加载到内存中),但只能在一些批量大小和不同框架中(不在 Keras 中)。 GTX 1070 似乎总是有 8Gb 的内存。

所以看起来 4Gb 显然不足以微调 VGG-16,而 8Gb可能就足够了。

问题是:多少内存足以用 Keras+TF 微调 VGG-16? 6Gb 就够了吗,还是 8Gb 最低也可以,还是需要更大的?

【问题讨论】:

  • 您是否尝试过使用Keras applications 中提供的VGG16 模型?我的 GPU 是 740M 并且有 2GB 内存,但我可以加载模型(当然,使用 include_top=False)。如果你不需要最后一层,这种方法会更好,因为它根本不加载它,因此以后不需要删除它(你知道最后一层很大!)。
  • 此外,在过去,我可以使用 1 个单位的 Dense 层作为最后一层对其进行微调。
  • @today 非常感谢,我刚刚尝试了这种预测方法,它能够在 GTX 760 上进行预测,当然还有所有的 FC 层!我会尝试在没有顶层的情况下进行微调。

标签: python tensorflow machine-learning keras vgg-net


【解决方案1】:

我在 Tensorflow 中微调了 VGG-16,批量大小为 32(GPU:8GB)。 我认为这与 Keras 使用 Tensorflow 的情况相同。但是,如果您想使用更大的批量进行训练,则可能需要 12 或 16 GB GPU。

【讨论】:

  • 谢谢!我是否正确理解您使用全连接层微调了完整模型?
猜你喜欢
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 2017-12-05
  • 2019-10-31
  • 2018-08-03
  • 1970-01-01
  • 2012-05-27
  • 2017-08-27
相关资源
最近更新 更多