Как использовать предварительно натренированный вес для тренировки сверточной НС в тензорном потоке?
В своем эксперименте я хочу обучить сверточную NN (CNN) с помощью cifar10 на imagenet, и я использовал ResNet50
. Поскольку cifar10 - это набор изображений ResNet50
32x32x3, тогда как используется 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 на имагенете? Может ли кто-нибудь поделиться возможными мыслями или эффективным способом сделать это в тензорном потоке? Любая идея? Спасибо!
Ответы
Вы можете получить эту ошибку, потому что пытаетесь выделить память (RAM) для всех данных сразу. Для начала вы можете использовать numpy
arrat для хранения изображений, а затем эти изображения конвертируются в tensors
. Таким образом, у вас уже есть вдвое больше памяти еще до того, как что-либо создавать. Вдобавок resnet
ко всему , это очень тяжелая модель, поэтому вы пытаетесь передать все данные сразу. Вот почему модели работают с batches
. Попробуйте создать генератор, используя tf.data.Dataset
документацию или воспользуйтесь очень простым keras.preprocessing.Image.ImageDataGenerator
классом. Это очень простой в использовании. Вы можете сохранить адрес ваших файлов изображений в Datarame
столбце с другим столбцом, представляющим класс и использование .flow_from_directory
. Или вы можете использовать, flow_from_directory
если ваши изображения сохранены в каталоге.
Ознакомьтесь с документацией