Можно ли обучить CNN, начиная с промежуточного уровня (в целом и в Керасе)?

Я использую 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))

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

    для слоя в 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(слои.Dropout(0,5)) model.add(layer.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_outin] [x]

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

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

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

    model.fit (last_frozen_layer_output, y_train, batch_size = 2, epochs = 10)

0 ответов

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

Во-первых, трудный путь заставляет вас создавать две новые модели: одну со всеми замороженными слоями, другую со всеми обучаемыми слоями. Добавьте слой 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 вы будете тренировать на лету, а затем просто вызвать model.fit(), чтобы продолжить обучение.

Другие вопросы по тегам