如何使用预训练权重来训练张量流中的卷积神经网络?

时间:2020-08-18 03:34:30

标签: python tensorflow conv-neural-network

在我的实验中,我想在imagenet上使用cifar10训练卷积神经网络(CNN),并且我使用了ResNet50。由于cifar10是32x32x3的图像集,而ResNet50使用224x224x3。为此,我需要调整输入图像的大小,以便在imagenet上训练CNN。但是,我进行了后续尝试,尝试在imagenet上训练简单的CNN

我当前的尝试

请参阅my whole implementation in this 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)来训练卷积神经网络;我不确定如何在张量流中完成此操作。任何人都可以提供可行的方法来实现这一目标吗?谢谢

有人可以指出我的尝试出了什么问题吗?在imagenet上使用cifar10训练最新的CNN模型的正确方法是什么?任何人都可以在张量流中分享可能的想法或有效的方法吗?任何想法?谢谢!

1 个答案:

答案 0 :(得分:0)

您可能会收到此错误,因为您试图一次将内存(RAM)分配给整个数据。对于初学者,您可能使用numpy arrat存储图像,然后将这些图像转换为tensors。因此,即使在创建任何东西之前,您已经拥有2倍的内存。最重要的是,resnet是非常繁重的模型,因此您尝试一次传递所有数据。这就是为什么模型可以使用batches的原因。尝试使用tf.data.Dataset documentation或使用非常简单的keras.preprocessing.Image.ImageDataGenerator类来创建生成器。这是非常容易使用。您可以将图像文件的地址保存在Datarame列中,而另一列代表类并使用.flow_from_directory。或者,如果您将图像保存在目录中,则可以使用flow_from_directory

Checkout the documentation