Как выполнить перенос обучения на предварительно обученном ResNet50 с другим размером изображения

У меня есть предварительно обученная модель ResNet, которая обучена изображениям 64x64. Я хотел бы провести трансферное обучение с новым набором данных, содержащим изображения 200x200.

Я загружаю модель следующим образом:

model = ResNet50(include_top=False, weights=None, input_shape=(64,64,3))
model.load_weights("a trained model weights on 64x64")

model.layers.pop()
for layer in model.layers:
   layer.trainable = False

x = model.output
x = MaxPooling2D((2,2), strides=(2,2), padding='same')(x)
x = Flatten(name='flatten')(x)
x = Dropout(0.2)(x)
x = Dense(512, activation='relu')(x)
predictions = Dense(101, activation='softmax', name='predictions')(x)

top_model = Model(inputs=model.input, outputs=predictions)

top_model.compile(loss='categorical_crossentropy',
        optimizer=adam,
        metrics=[accuracy])

EPOCHS = 100
BATCH_SIZE = 32
STEPS_PER_EPOCH = 4424 // BATCH_SIZE
VALIDATION_STEPS = 466 // BATCH_SIZE

callbacks = [LearningRateScheduler(schedule=Schedule(EPOCHS, initial_lr=lr_rate)),
                ModelCheckpoint(str(output_dir) + "/weights.{epoch:03d}-{val_loss:.3f}-{val_age_mae:.3f}.hdf5",
                                 monitor="val_age_mae",
                                 verbose=1,
                                 save_best_only=False,
                                 mode="min")
                 ]

hist = top_model.fit_generator(generator=train_set,
                               epochs=EPOCHS,
                               steps_per_epoch = STEPS_PER_EPOCH,
                               validation_data=val_set,
                               validation_steps = VALIDATION_STEPS,
                               verbose=1,
                               callbacks=callbacks)


Я хотел бы провести трансферное обучение на основе изображений размером 200x200 пикселей. Я очень новичок в этом, как я могу изменить?

есть ли способ изменить форму ввода модели? и нужно ли мне что-то делать с пространственным размером?

И какой оптимизатор рекомендуется? Адам или СГД?


__________________________________________________________________________________________________
res5c_branch2a (Conv2D)         (None, 2, 2, 512)    1049088     activation_46[0][0]              
__________________________________________________________________________________________________
bn5c_branch2a (BatchNormalizati (None, 2, 2, 512)    2048        res5c_branch2a[0][0]             
__________________________________________________________________________________________________
activation_47 (Activation)      (None, 2, 2, 512)    0           bn5c_branch2a[0][0]              
__________________________________________________________________________________________________
res5c_branch2b (Conv2D)         (None, 2, 2, 512)    2359808     activation_47[0][0]              
__________________________________________________________________________________________________
bn5c_branch2b (BatchNormalizati (None, 2, 2, 512)    2048        res5c_branch2b[0][0]             
__________________________________________________________________________________________________
activation_48 (Activation)      (None, 2, 2, 512)    0           bn5c_branch2b[0][0]              
__________________________________________________________________________________________________
res5c_branch2c (Conv2D)         (None, 2, 2, 2048)   1050624     activation_48[0][0]              
__________________________________________________________________________________________________
bn5c_branch2c (BatchNormalizati (None, 2, 2, 2048)   8192        res5c_branch2c[0][0]             
__________________________________________________________________________________________________
add_16 (Add)                    (None, 2, 2, 2048)   0           bn5c_branch2c[0][0]              
                                                                 activation_46[0][0]              
__________________________________________________________________________________________________
activation_49 (Activation)      (None, 2, 2, 2048)   0           add_16[0][0]                     
__________________________________________________________________________________________________
pred_age (Dense)                (None, 2, 2, 101)    206848      activation_49[0][0]              
==================================================================================================
Total params: 23,794,560
Trainable params: 23,741,440
Non-trainable params: 53,120
__________________________________________________________________________________________________

Получение следующей ошибки

ValueError: Error when checking input: expected input_1 to have shape (64, 64, 3) but got array with shape (128, 128, 3)

person TheJokerAEZ    schedule 31.03.2019    source источник
comment
Что вы пробовали? Ваш подход работает?   -  person Sharky    schedule 31.03.2019
comment
Мой подход не работает :( Поскольку я новичок в этом, возможно ли перенести обучение на другой размер изображения на предварительно обученную модель с другим размером изображения?   -  person TheJokerAEZ    schedule 31.03.2019
comment
Что говорится в сообщении об ошибке?   -  person Sharky    schedule 31.03.2019
comment
ValueError: Ошибка при проверке ввода: ожидалось, что input_1 будет иметь форму (64, 64, 3), но получен массив с формой (128, 128, 3)   -  person TheJokerAEZ    schedule 31.03.2019
comment
Пожалуйста, обновите свой вопрос, указав полный код. В частности, добавьте вывод top_model.summary(), и если вы попытаетесь использовать `.fit(), добавьте форму входных данных. Также добавьте сообщения об ошибках. Это сделает ваш вопрос ясным и конкретным   -  person Sharky    schedule 01.04.2019
comment
Обновил вопросы, надеюсь, вопрос ясен. Я хочу изменить входную форму текущей модели (обученной на изображениях 64x64) с переносом обучения на новые данные (200x200)   -  person TheJokerAEZ    schedule 01.04.2019


Ответы (1)


Рассмотрим пример, я использовал вашу модель как есть, изменил только входные данные.

test = np.random.rand(10, 128, 128, 3)

Как видите, это случайный массив, 10 пакетов размером 128, 128, 3.

top_model.fit(test, epochs=1, batch_size=1, steps_per_epoch = 10)

Затем я использовал метод подгонки, просто для демонстрации.

ValueError: Ошибка при проверке ввода: ожидалось, что input_1 будет иметь форму (64, 64, 3), но получен массив с формой (128, 128, 3)

Это сообщение об ошибке. Очевидно, что ваши входные данные имеют неправильную форму. Добавьте функцию, которая производит generator=train_set. И лучше использовать Dataset API с методом fit. Это проще и быстрее. https://www.tensorflow.org/guide/datasets

person Sharky    schedule 01.04.2019