Можно ли обучить CNN, начиная с промежуточного уровня (в целом и в Керасе)? - PullRequest
0 голосов
/ 05 февраля 2019

Я использую mobilenet v2 для обучения модели на моих изображениях.Я заморозил все слои, кроме нескольких, а затем добавил дополнительные слои для обучения.Я бы хотел тренироваться с промежуточного уровня, а не с самого начала.Мои вопросы:

  1. Можно ли предоставить выходные данные последнего замороженного слоя в качестве входных данных для обучения (это будет тензор (?, 7,7,1280))?
  2. Как определить тренировку, чтобы начать с этого первого обучаемого (не замороженного) слоя?В этом случае mbnetv2_conv.layer [153].
  3. Что такое y_train в этом случае?Я не совсем понимаю, как y_train используется в процессе обучения - вообще, когда CNN ссылается на y_train?

    Загрузить mobilenet v2

    image_size = 224 mbnetv2_conv = MobileNetV2 (weights = 'imagenet', include_top = False, input_shape = (image_size, image_size, 3))

    Заморозить все слои, кроме последних 3 слоев

    для слоя в mbnetv2_conv.layers [: - 3]: layer.trainable = False

    Создать модель

    model = models.Sequential () model.add (mbnetv2_conv) model.add (Layers.Flatten ()) model.add (Layers.Dense (16, активация = 'relu')) model.add (elements.Dropout (0.5)) model.add (слои.Dense (3, активация = 'softmax')) model.summary ()

    Создайте массив (?, 224,224,3) из изображений

    x_train = np.array (all_images)

    Получите выходные данные слоя

    из бэкэнда импорта keras как K get_last_frozen_layer_output =K.function ([mbnetv2_conv.layers [0] .input], [mbnetv2_conv.layers [152] .output]) last_frozen_layer_output = get_last_frozen_layer_output ([x_train]) [0]

    Скомпилируйте модель

    из keras.optimizers import SGD sgd = SGD (lr = 0,01, распад = 1e-6, импульс = 0,9, нестеров =)True) model.compile (loss = 'categoryorical_crossentropy', optimizer = sgd, metrics = ['acc'])

    как тренироваться с определенного слоя и каким должен быть y_train?

    модель.fit (last_frozen_layer_output, y_train, batch_size = 2, epochs = 10)

1 Ответ

0 голосов
/ 31 мая 2019

Да, вы можете.Два разных способа.

Во-первых, трудный путь заставляет вас строить две новые модели: одну со всеми замороженными слоями, одну со всеми обучаемыми слоями.Добавьте слой Flatten () в модель только для замороженных слоев.И вы будете копировать весовые коэффициенты из mobilenet v2 слой за слоем, чтобы заполнить весовые характеристики модели только для замороженных слоев.Затем вы проведете свои входные изображения через модель «только замороженные слои», сохраняя вывод на диск в виде CSV или в форме маринада.Теперь это вход для вашей модели обучаемых слоев, которую вы тренируете с помощью команды model.fit (), как вы делали выше.Сохраняйте вес, когда закончите тренировку.Затем вам нужно будет построить оригинальную модель с обоими наборами слоев, загрузить веса в каждый слой и сохранить все.Готово!

Однако проще всего сохранить веса вашей модели отдельно от архитектуры с помощью:

model.save_weights(filename)

, а затем изменить свойство layer.trainable слоев вMobileNetV2 перед добавлением его в новую пустую модель:

mbnetv2_conv = MobileNetV2(weights='imagenet', include_top=False, input_shape=(image_size, image_size, 3))
for layer in mbnetv2_conv.layers[:153]:
    layer.trainable = False
model = models.Sequential() 
model.add(mbnetv2_conv) 

, а затем перезагрузите веса с помощью

newmodel.load_weights(filename)

Это позволяет вам настроить, какие слои в вашей модели mbnetv2_conv вы будете тренировать наfly, а затем просто вызовите model.fit (), чтобы продолжить обучение.

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