Как использовать предварительно натренированный вес для тренировки сверточной НС в тензорном потоке?

Aug 18 2020

В своем эксперименте я хочу обучить сверточную NN (CNN) с помощью cifar10 на imagenet, и я использовал ResNet50. Поскольку cifar10 - это набор изображений ResNet5032x32x3, тогда как используется 224x224x3. Для этого мне нужно изменить размер входного изображения, чтобы обучать CNN imagenet. Тем не менее, я подошел к следующей попытке тренировать простые CNNна ImageSet:

моя текущая попытка :

Пожалуйста, посмотрите всю мою реализацию в этом смысле :

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как можно меньше, и все равно получаю ошибку. Мне интересно, способ обучения CNN на изображении выше может быть неправильным или что-то не так в моей попытке.

обновление :

Я хочу понять, как насчет использования предварительно обученных весов (например, ResNet50 на imagenet) для обучения сверточной NN; Я не уверен, как это сделать в тензорном потоке. Может ли кто-нибудь предоставить возможный реальный подход, чтобы сделать это правильно? Спасибо

Может ли кто-нибудь указать мне, что пошло не так с моей попыткой? Каким будет правильный способ обучения современной CNNмодели с помощью cifar10 на имагенете? Может ли кто-нибудь поделиться возможными мыслями или эффективным способом сделать это в тензорном потоке? Любая идея? Спасибо!

Ответы

Deshwal Aug 18 2020 at 10:44

Вы можете получить эту ошибку, потому что пытаетесь выделить память (RAM) для всех данных сразу. Для начала вы можете использовать numpyarrat для хранения изображений, а затем эти изображения конвертируются в tensors. Таким образом, у вас уже есть вдвое больше памяти еще до того, как что-либо создавать. Вдобавок resnetко всему , это очень тяжелая модель, поэтому вы пытаетесь передать все данные сразу. Вот почему модели работают с batches. Попробуйте создать генератор, используя tf.data.Dataset документацию или воспользуйтесь очень простым keras.preprocessing.Image.ImageDataGeneratorклассом. Это очень простой в использовании. Вы можете сохранить адрес ваших файлов изображений в Datarameстолбце с другим столбцом, представляющим класс и использование .flow_from_directory. Или вы можете использовать, flow_from_directoryесли ваши изображения сохранены в каталоге.

Ознакомьтесь с документацией