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