如何在TensorFlow中使用预训练权重来训练卷积神经网络?

3
在我的实验中,我想使用cifar10数据集中的图像训练卷积神经网络(CNN)在imagenet数据集上,并使用了ResNet50模型。由于cifar10数据集中的图像大小为32x32x3,而ResNet50模型所需的输入大小为224x224x3。因此,我需要调整输入图像的大小以便在imagenet上训练CNN。然而,我尝试在imagenet上训练简单的CNN时遇到了以下问题: 我当前的尝试: 请参见此Gist中我的完整实现:
base_model = ResNet50(weights='imagenet', include_top=False, input_shape=(224, 224, 3))
x = Conv2D(32, (3, 3))(base_model.output)
x = Activation('relu')(x)
x = MaxPooling2D(pool_size=(2,2))(x)
x = Flatten()(x)
x = Dense(256)(x)
x = Dense(10)(x)
x = Activation('softmax')(x)
outputs = x
model = models.Model(base_model.input, outputs)
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(X_train, y_train, batch_size=50, epochs=3, verbose=1, validation_data=(X_test, y_test))

但是我的尝试导致了ResourceExhaustedError; 我之前遇到过这个错误,改变batch_size后就解决了。但现在即使我将batch_size设置得很小,仍然会出现错误。我想知道在上面的imagenet上训练CNN的方法可能不正确或者我的尝试中出现了问题。

更新:

我想了解如何使用预训练权重(即在imagenet上的ResNet50)来训练卷积神经网络;我不确定如何在tensorflow中实现这一点。有人能提供可能可行的方法吗?谢谢。

有人能指出我的尝试何去错了吗?使用cifar10在imagenet上训练最先进的CNN模型的正确方式是什么?有人能分享在tensorflow中做到这一点的可能思路或高效方法吗?任何想法?谢谢!


1
ResNets在CIFAR10数据集上的训练并不使用224x224的尺寸,而是仅使用32x32的尺寸。因此,您需要从头开始训练网络,而不能使用预训练权重。 - Dr. Snoopy
@Dr.Snoopy 我想在使用Conv2D之前使用预训练的权重。你能分享一些可能的想法吗?谢谢。 - kim
1个回答

0
您可能因为一次性尝试为整个数据分配内存(RAM)而出现此错误。作为入门,您可能正在使用numpy数组来存储图像,然后这些图像将被转换为tensors。因此,在创建任何内容之前,您已经有了两倍的内存。除此之外,resnet是非常耗费资源的模型,因此您正在尝试一次传递整个数据。这就是为什么模型使用batches的原因。尝试使用tf.data.Datasetdocumentation创建生成器,或者使用非常简单的keras.preprocessing.Image.ImageDataGenerator类。它非常易于使用。你可以在Dataframe列中保存图像文件的地址,并使用另一列表示类别,然后使用.flow_from_directory。或者,如果图像保存在目录中,则可以使用flow_from_directory查看文档

我已经使用了4个T4 GPU,但仍然无法通过。此外,我没有尝试将RAM分配给整个数据。在回答之前,请查看我的这个gist中的尝试。谢谢。 - kim
不是关于T4GPU的问题。尝试使用ImageData Generator或创建自己的批处理。你会做得很好的。 - Deshwal
我不明白。你能否根据我上面的要点来简述一下?谢谢。 - kim
只需导入 ImageDataGenerator。请参考官方教程 - Deshwal
我知道这是为了数据增强,但你怎么确定这会解决问题呢?你看过我的尝试了吗? - kim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接