Какова лучшая практика, для которой CNN-полносвязные уровни следует сохранять при выполнении трансферного обучения? - PullRequest
3 голосов
/ 31 октября 2019

Не могу найти конкретного ответа на вопрос. В настоящее время я занимаюсь трансферным обучением из сети VGG19 , и моей целевой областью является классификация документов (либо исключительно по визуальной классификации, либо с использованием извлечения признаков CNN для другой модели). Я хочу понять, в каких случаях желательно сохранить все полностью связанные слои модели, а в каких случаях я должен удалить полностью связанные слои и создать новый полностью связанный слой поверх последнего сверточного слоя. Что каждый из этих вариантов подразумевает для обучения, предсказаний и т. Д.?

Это примеры кода с использованием Keras, которые я имею в виду:

Извлечение последнего полностью подключенного слоя:

original_model = VGG19(include_top=True, weights='imagenet', input_shape=(224, 224, 3))
layer_name = 'fc2'
x = Dropout(0.5)(original_model.get_layer(layer_name).output)
x = BatchNormalization()(x)
predictions = Dense(num_classes, activation='softmax')(x)

features_model = Model(inputs=original_model.input, outputs=predictions)
adam = optimizers.Adam(lr=0.001)
features_model.compile(optimizer=adam, loss='categorical_crossentropy', metrics=['accuracy'])
features_model.summary()

return features_model

Добавление одного полностью связанного слоя после последнего сверточного слоя:

original_model = VGG19(include_top=False, weights='imagenet', input_shape=(224, 224, 3))
x = Flatten()(base_model.output)
x = Dense(4096, activation='relu')(x)
x = Dropout(0.5)(x)
x = BatchNormalization()(x)
predictions = Dense(num_classes, activation='softmax')(x)

head_model = Model(input=base_model.input, output=predictions)

adam = optimizers.Adam(lr=0.001)
head_model.compile(optimizer=adam, loss='categorical_crossentropy', metrics=['accuracy'])
head_model.summary()
return head_model

Существует ли практическое правило для выбора при выполнении переноса-Learning?

1 Ответ

1 голос
/ 31 октября 2019

Согласно моему прошлому опыту, успешно применяя трансферное обучение с фондового рынка к бизнес-прогнозу, вы должны сохранять первоначальную структуру, потому что, если вы осуществляете трансферное обучение, вы захотите загружать обученные веса из исходной структуры, без проблем, связанных с различиями вархитектура нейронной сети. Затем вы разморозите части CNN, и ваша тренировка нейронной сети начнет тренировку с высокой точностью и адаптирует веса к целевой задаче.

Однако, если вы удалите слой Flatten, вычислительные затраты будут уменьшаться по мере того, как выу меня будет меньше параметров для обучения.

Я придерживаюсь правила сохранения нейронных сетей как можно более простым (равным большим обобщающим свойствам), с высокой эффективностью.

@ Kamen, как дополнение к вашемуКомментарий, касающийся того, сколько данных вам понадобится, зависит от дисперсии ваших данных. Больше дисперсии, вам нужно больше слоев и весов, чтобы изучить детали. Однако, когда вы увеличиваете сложность в архитектуре, ваша нейронная сеть будет более склонна к переобучению, чем может быть уменьшена, например, с помощью Dropout.

Поскольку полностью связанные слои являются более дорогой частью нейронной сети,если вы добавите один или два из них, ваш номер параметра значительно увеличится, что потребует больше времени для обучения. Чем больше слоев, тем выше точность, но у вас может быть переобучение.

Например, MNIST с 10 000 примеров может достичь точности более 99% при довольно простой архитектуре. Однако IMAGENET имеет 1 000 000 примеров (155 ГБ), а затем требует более сложной структуры, например VGG16.

...