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

Но одно можно сказать наверняка: нейронная сеть не является чем-то новым. Наверняка кто-то проделал эту работу и построил работоспособную модель нейронной сети для конкретных задач. И вот оно!

🤔 А что, если мы воспользуемся моделью, обученной другими профессионалами, и применим ее к своей проблеме? Именно это и делает Трансферное обучение.

Иллюстрация (курс от нуля до уровня мастерства)

Трансферное обучение может помочь нам:

  • Используйте существующую обученную модель, которая доказала свою эффективность — сэкономьте время
  • Используйте модель, которая уже усвоила закономерности решения проблем, над которыми мы работаем.

Как найти доступные структуры модели и как их использовать? Здесь я представляю два метода. В этом блоге я использую домен изображения и EfficientNetB0 в качестве примера архитектуры.

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

Загрузите модель из TensorFlow Hub.

Во-первых, давайте перейдем к [TensorFlow Hub]. На главной странице мы можем увидеть различные типы проблемных областей.

  1. Нажмите Изображение.
  2. В разделе Фильтры слева выберите решения вашей проблемы. Здесь мы выбираем только Классификация изображений и Вектор признаков изображения.
  3. Выберите версию TF2. (и вы, вероятно, можете увидеть результаты ниже)

4. Выберите одну архитектуру, например. Эффективное телевидение2. Вы войдете на страницу и, прокрутив вниз, увидите кнопку Копировать URL, здесь вы можете получить режим.

Как только мы получим ссылку, давайте начнем писать коды.

model_url = https://tfhub.dev/google/imagenet/efficientnet_v2_imagenet1k_b0/feature_vector/2

# dowload the pretrained model and save it as a Keras layer
feature_extract_layer = hub.KerasLayer(model_url,
                                       trainable=False, # freeze the underlying patterns
                                       name='feature_extraction_layer',
                                       input_shape=IMAGE_SHAPE)

# Create our own model
# Same steps as creating a neural network model
# Assume we are solving muti-class classification problem
model = tf.keras.Sequential([
    feature_extract_layer,
    tf.keras.layers.Dense(num_classes, activation='softmax', name='output_layer')
])

# compile
...
#fit
...

Используйте модель с tf.keras.applications

[tf.keras.applications] — один из замечательных модулей TensorFlow, который предоставляет пользователям десятки предварительно обученных архитектур моделей, работа которых в настоящее время доказана. Помимо EfficientNetBX, он также содержит такие архитектуры, как ResNet, Regnet, mobilenet и т. д.

Вот шаги для создания собственной модели трансферного обучения:

# 1. Create a base model (we don't include the top here because we are going to add our own Dense layer)
base_model = tf.keras.applications.EfficientNetB0(include_top=False)

# 2. Freeze the base model (so the underlying pre-trained patterns aren't updatted during training)
base_model.trainable=False

# 3. Create inputs into our model
inputs = tf.keras.layers.Input(shape=(224,224,3), name="input_layer")

# 4. If using a model like ResNet50V2, you will need to normalize inputs (EfficientNet don't require)
# x = tf.keras.layers.experimental.preprocessing.Rescaling(1/255.)(inputs)

# 5. Pass the inputs to the base model
x = base_model(inputs, training=False)
print(f"Shape after passing inputs through base model: {x.shape}")

# 6. Average pool the outputs of the base model (aggregate all the most important information, reduce number of computations)
x = tf.keras.layers.GlobalAveragePooling2D(name="global_average_pooling_layer")(x)
print(f"Shape after GlobalAveragePooling2D: {x.shape}")

# 7. Create the output activation layer
outputs = tf.keras.layers.Dense(10, activation='softmax', name="output_layer")(x)

# 8. Combine the inpouts with the outputs into our model
model_0 = tf.keras.Model(inputs, outputs)

# Compile
...
# Fit
...

Советы:

  • Если ваш собственный набор данных имеет другое количество классификаций, чем набор данных, на котором обучалась модель, установите include_top=False.
  • Проверьте, нуждается ли базовая модель в масштабировании или нормализации. (EfficientNetB0 имеет свои собственные слои масштабирования и нормализации, поэтому я пропускаю это в данном случае)
  • Если вы не собираетесь точно настраивать предварительно обученную модель, установите base_model.trainable=False, а когда вы передаете входной слой в базовую модель, установите x = base_model(inputs, training=False).
  • Для объекта модели введите слои в первую скобку. Для объекта слоя введите слои во второй скобке. (например, tf.keras.layers.Dense(10, activation='softmax', name="output_layer")(x))

Заключение

Я считаю, что два из этих методов полезны для использования трансферного обучения. Однако если вы хотите дополнительно уточнить модель, лучше использовать tf.keras.applications .