在Keras的GPU上进行Finetuning VGG-16:内存消耗

时间:2018-06-17 18:46:16

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

我正在为我的任务微调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是最小的还是可以的,还是需要更大的东西?

1 个答案:

答案 0 :(得分:1)

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