Представьте себе сценарий, в котором вам говорят, что использование предварительно обученных весов (скажем, resnet-50, 101 и т. Д.) В качестве экстрактора функций (магистральная архитектура) для вашей модели глубокой нейронной сети (DNN) может значительно повысить производительность вашей модели, а также сэкономить у вас много тренировочного времени. Если вы чем-то похожи на меня, вы будете чрезвычайно довольны этим и сразу же погрузитесь в изучение того, как использовать эти предварительно натренированные веса.

Для большинства этих архитектур люди из keras, pytorch и т. Д. И другие члены обширного сообщества ИИ уже предоставили простые реализации. Например, для использования весов ResNet-50 в keras, просто включение следующего в ваш код позволит вам использовать ResNet50 как любой другой слой keras.

из keras.applications.resnet импортировать ResNet50

Теперь, что, если кто-то хочет использовать веса, которые еще не предусмотрены в вышеупомянутых простых в использовании реализациях. И чтобы еще больше усложнить ситуацию, как насчет весов, которые необходимо перенести в разные библиотеки машинного обучения, в разные версии. Я столкнулся с такой ситуацией, когда решил использовать веса SimCLR для ResNet-50. Реализация исследовательской группой Google выполняется на tensorflow-1.15, тогда как у меня было два отдельных проекта, работающих с (tensorflow-1.14, keras-2.2.4) и ( tenorflow-2.2, keras-2.4.3). В зависимости от того, какая комбинация tf / keras используется, есть небольшая разница в переносе исходных весов в модель keras. Здесь я расскажу о шагах, которые я предпринял для этой задачи со второй комбинацией библиотек, упомянутой выше.

Шаг 1: Подготовьте эквивалентную модель кераса. Убедитесь, что в исходной модели и создаваемой вами модели используются одинаковые имена для слоев. В моем случае это «block_group3», «block_group4» и т. Д.

Шаг 2. Загрузите файл предварительно обученных весов вместе с другими необходимыми файлами, такими как checkpoint, model.ckpt-250228.data-00000-of-00001, model.ckpt-250228.index, model.ckpt-250228. мета. Я не уверен, все ли нужно загружать, но на всякий случай. Здесь «250228» означает номер последней эпохи.

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

Шаг 4: Ниже приведен фрагмент для получения весов модели с помощью сеанса тензорного потока. Следуя упомянутым шагам, вы должны получить имена и веса слоев.

Предупреждение: вполне вероятно, что вам, возможно, придется использовать «* .meta-файл», созданный на вашем собственном компьютере (но с той же моделью тензорного потока, что и исходный) для запуска приведенного выше фрагмента кода. В этом случае Шаг 0: создайте модель тензорного потока и сохраните метафайл (номер эпохи не имеет значения).

Теперь, когда веса извлечены, наступает следующий этап переноса весов в модель keras. Для этого выполните следующие действия.

Шаг 5: Вызов объекта модели, созданного на шаге 1, установите веса для всех интересующих слоев, используя сохраненные имена слоев и соответствующие списки весов.

model = keras.models.Model(inputs = [input1, input2, ...],
                           outputs = [output1, output2, ..],
                           name = 'some_model_name')
for layer_name, weight_list in model_vars.items():
  model.get_layer(layer_name).set_weights(weight_list)

Шаг 6: Сохраните веса модели для модели keras для будущего использования.

# Save the model in keras suitable format
model.save_weights('path/to/model.h5')
#Default mode
model.trainable = False
return model

Теперь, используя приведенный выше фрагмент кода, вы хорошо настроены для обучения своей собственной модели keras с основой, состоящей из предварительно обученных весов. Однако что, если кто-то хочет настроить последние несколько слоев магистрали для своих конкретных нужд. Для этого вы можете включить следующие дополнительные строки кода, которые вручную изменят «обучаемый» характер слоев.

outputs = []
for layer_name in layers: 
  #extract specific features by 'layer names'
  outputs.append(self.model.get_layer(layer_name).output)
if stop_train:# 'layer name' beyond which layers are trainable
  trainable = False
  for layer in self.model.layers:
      if stop_train == layer.name:
         trainable = True #Switch the trainability character
      layer.trainable = trainable
return KM.Model(inputs = self.model.input, outputs = outputs, name = ‘model_name’) # return the model object

Теперь у вас есть объект модели keras, который можно использовать как слой keras, как объект.

Если вы находите подобные истории ценными и хотели бы поддержать меня как писателя, подумайте о подписке на членство Medium. Это 5 долларов в месяц и дает вам неограниченный доступ к статьям Medium. Регистрация по реферальной ссылке предоставит мне небольшую комиссию без каких-либо дополнительных затрат для вас.