Шаг 228.
Глубокое обучение на Python. ... . Современные архитектурные шаблоны сверточных сетей. Собираем все вместе: мини-модель с архитектурой Xception

    На этом шаге мы рассмотрим пример использования архитектуры Xception.

    Вспомним принципы архитектуры сверточных сетей, с которыми вы уже познакомились:

    Попробуем воплотить все эти идеи в модели с архитектурой, напоминающей уменьшенную версию архитектуры Xception, и применить ее для решения задачи распознавания кошек и собак. Для загрузки данных и обучения модели мы повторно используем код из 214 шага, но заменим определение модели следующей сверточной сетью:


inputs = keras.Input(shape=(180, 180, 3))
# Настройки для механизма обогащения данных остаются такими же
x = data_augmentation(inputs)
# Не забудьте масштабировать входные данные!
x = layers.Rescaling(1./255)(x)
# Обратите внимание, что предположение о "практически полной независимости 
# каналов признаков", лежащее в основе раздельной свертки, не выполняется 
# для изображений RGB! Каналы красного, зеленого и синего цветов на самом 
# деле сильно коррелируют в естественных изображениях. Поэтому первый слой в 
# нашей модели - это обычный слой Conv2D. Слои SeparableConv2D 
# будут использоваться потом
x = layers.Conv2D(filters=32, kernel_size=5, use_bias=False)(x)
# Создать последовательность сверточных блоков с увеличением глубины 
# признаков. Каждый блок включает два слоя раздельной свертки по глубине, 
# два слоя пакетной нормализации, слой объединения с выбором максимального 
# значения из соседних и остаточную связь в обход всего блока
for size in [32, 64, 128, 256, 512]: 
  residual = x 
  x = layers.BatchNormalization()(x) 
  x = layers.Activation("relu")(x) 
  x = layers.SeparableConv2D(size, 3, padding="same", use_bias=False)(x) 
  x = layers.BatchNormalization()(x) 
  x = layers.Activation("relu")(x) 
  x = layers.SeparableConv2D(size, 3, padding="same", use_bias=False)(x) 
  x = layers.MaxPooling2D(3, strides=2, padding="same")(x) 
  residual = layers.Conv2D( 
      size, 1, strides=2, padding="same", use_bias=False)(residual) 
  x = layers.add([x, residual])
  
# В первоначальной модели мы использовали слой Flatten перед слоем Dense. 
# Здесь применяется слой GlobalAveragePooling2D
x = layers.GlobalAveragePooling2D()(x)
# Так же, как в исходной модели, мы добавили слой прореживания для регуляризации
x = layers.Dropout(0.5)(x)
outputs = layers.Dense(1, activation="sigmoid")(x)
model = keras.Model(inputs=inputs, outputs=outputs)

Блокнот с этим примером можно взять здесь.

    Эта сверточная сеть имеет 721 857 обучаемых параметров - меньше, чем в первоначальной модели, где обучаемых параметров было 991 041, - тем не менее качество ее прогнозов находится на аналогичном уровне. На рисунке 1 показаны графики изменения точности и потерь на этапах обучения и проверки.



Рис.1. Графики изменения метрик на этапах обучения и проверки для Xception-подобной архитектуры

    Наша новая модель достигла точности 89,1% на контрольных данных, что существенно лучше 84,7% у первоначальной модели.

    Как видите, следование рекомендациям по архитектуре оказывает значительное влияние на качество!

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

    Обратите внимание, что рекомендуемые приемы организации архитектуры моделей, представленные в этих шагах, относятся к компьютерному зрению в целом, а не только к классификации изображений. Например, архитектура Xception используется как стандартная сверточная основа в DeepLabV3 - современном решении сегментации изображений.


Chen L.-C. et al. Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation // ECCV, , 2018, https://arxiv.org/abs/1802.02611.

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

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




Предыдущий шаг Содержание Следующий шаг