Тонкая настройка модели, удаление предыдущих добавленных слоев - PullRequest
0 голосов
/ 27 февраля 2019

Я использую Keras 2.2.4.Я тренирую модель, которую хочу каждые 30 эпох настраивать с новым содержанием данных (классификация изображений).

Каждый день я добавляю больше изображений в классы, чтобы кормить модель.Каждые 30 эпох модель переобучается.Я использую 2 условия: первое, если предыдущая модель уже не обучена, и второе условие, когда модель уже обучена, и я хочу настроить его с новым контентом / классами.

model_base = keras.applications.vgg19.VGG19(include_top=False, input_shape=(*IMG_SIZE, 3), weights='imagenet')
output = GlobalAveragePooling2D()(model_base.output)

# If we resume a pretrained model load it
if os.path.isfile(os.path.join(MODEL_PATH, 'weights.h5')): 
    print('Using existing weights...')
    base_lr = 0.0001

    model = load_model(os.path.join(MODEL_PATH, 'weights.h5'))
    output = Dense(len(all_character_names), activation='softmax', name='d2')(output)
    model = Model(model_base.input, output)

    for layer in model_base.layers[:-2]:
        layer.trainable = False 
else:
    base_lr = 0.001

    output = BatchNormalization()(output)
    output = Dropout(0.5)(output)
    output = Dense(2048, activation='relu', name='d1')(output)
    output = BatchNormalization()(output)
    output = Dropout(0.5)(output)
    output = Dense(len(all_character_names), activation='softmax', name='d2')(output)
    model = Model(model_base.input, output)

    for layer in model_base.layers[:-5]:
        layer.trainable = False 


opt = optimizers.Adam(lr=base_lr, decay=base_lr / epochs)
model.compile(optimizer=opt,
            loss='categorical_crossentropy',
            metrics=['accuracy'])

Сводка модели в первый раз:

...
_________________________________________________________________
block5_conv4 (Conv2D)        (None, 14, 14, 512)       2359808   
_________________________________________________________________
block5_pool (MaxPooling2D)   (None, 7, 7, 512)         0         
_________________________________________________________________
global_average_pooling2d_1 ( (None, 512)               0         
_________________________________________________________________
batch_normalization_1 (Batch (None, 512)               2048      
_________________________________________________________________
dropout_1 (Dropout)          (None, 512)               0         
_________________________________________________________________
d1 (Dense)                   (None, 2048)              1050624   
_________________________________________________________________
batch_normalization_2 (Batch (None, 2048)              8192      
_________________________________________________________________
dropout_2 (Dropout)          (None, 2048)              0         
_________________________________________________________________
d2 (Dense)                   (None, 19)                38931     
=================================================================
Total params: 21,124,179
Trainable params: 10,533,907
Non-trainable params: 10,590,272

Сводка модели во второй раз:

...
_________________________________________________________________
block5_conv4 (Conv2D)        (None, 14, 14, 512)       2359808   
_________________________________________________________________
block5_pool (MaxPooling2D)   (None, 7, 7, 512)         0         
_________________________________________________________________
global_average_pooling2d_1 ( (None, 512)               0         
_________________________________________________________________
d2 (Dense)                   (None, 19)                9747      
=================================================================
Total params: 20,034,131
Trainable params: 2,369,555
Non-trainable params: 17,664,576

Проблема: Когда модель существует и загружается для точной настройки, кажется, что в первый раз теряются все дополнительные слои, добавленные в первый раз (плотный)2048, Dropout и т. Д.)

Нужно ли снова добавлять эти слои?Кажется, в этом нет никакого смысла, так как это приведет к потере обучающей информации, полученной при первом проходе.

Примечание: мне может не потребоваться устанавливать base_lr, поскольку при сохранении модели также должна сохраняться скорость обучения в состоянии, в котором онаостановился раньше, но я проверю это позже.

1 Ответ

0 голосов
/ 27 февраля 2019

Обратите внимание, что после загрузки модели:

model = load_model(os.path.join(MODEL_PATH, 'weights.h5'))

Вы не используете ее.Вы просто перезаписываете его снова

model = Model(model_base.input, output)

Где вывод также определяется как операция над base_model.Мне кажется, что вы просто хотите удалить строки после load_model.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...