Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шолле Ф. - Глубокое обучение на Python (Библиотека программиста) - 2023.pdf
Скачиваний:
6
Добавлен:
07.04.2024
Размер:
11.34 Mб
Скачать

326    Глава 9. Введение в глубокое обучение в технологиях зрения

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

Небольшое неудобство в одном случае может превратиться в непроходимую стену в другом: вся аппаратная и программная экосистема глубокого обучения оптимизирована для очень конкретного набора алгоритмов (в частности, сверточных сетей, обучаемых через обратное распространение) и любое отклонение от проторенных дорог обходится чрезвычайно дорого. Если вам доведется экспериментировать с альтернативными алгоритмами, такими как безградиентная оптимизация или спайковые нейронные сети (Spiking Neural Networks), то первые ваши параллельные реализации на C++ или CUDA будут на порядки медленнее старой доброй сверточной сети, и неважно, насколько умны и эффективны ваши идеи. Вам будет сложно убедить других исследователей принять ваш метод, даже если он окажется лучше.

Современное глубокое обучение является продуктом коэволюции оборудования, программного обеспечения и алгоритмов. Доступность графических процессоров NVIDIA и CUDA привела к первому успеху сверточных сетей, обучаемых через обратное распространение, что заставило NVIDIA оптимизировать свои аппаратные и программные технологии для этих алгоритмов. Это, в свою очередь, привело к консолидации исследовательского сообщества вокруг данных методов. Выбор же другого пути в настоящее время потребует многолетней реорганизации всей экосистемы.

9.3.5. Собираем все вместе: мини-модель с архитектурой Xception

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

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

.количество.фильтров.в.слоях.должно.увеличиваться.с.уменьшением.размеров. карт.пространственных.признаков;

Настройки для механизма обогащения данных остаются такими же
Не забудьте масштабировать входные данные!

9.3. Современные архитектурные шаблоны сверточных сетей    327

. глубокие.и.узкие.модели.лучше.широких.и.неглубоких;

.добавление.остаточных.связей.в.обход.блоков.слоев.помогает.обучать.более. глубокие.сети;

.иногда.полезно.добавлять.слои.пакетной.нормализации.после.сверточных. слоев;

.иногда.полезно.заменить.слои.Conv2D .слоями.SeparableConv2D,.более.эффективными.по.параметрам.

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

inputs = keras.Input(shape=(180, 180, 3)) x = data_augmentation(inputs)

x = layers.Rescaling(1./255)(x)

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. Здесь

x = layers.GlobalAveragePooling2D()(x)

 

 

применяется слой GlobalAveragePooling2D

 

 

x = layers.Dropout(0.5)(x)

 

 

 

 

 

 

 

 

outputs = layers.Dense(1, activation="sigmoid")(x)

Так же, как в исходной

 

model = keras.Model(inputs=inputs, outputs=outputs)

 

модели, мы добавили

 

 

 

 

 

 

 

 

слой прореживания для

 

Создать последовательность сверточных

 

 

регуляризации

 

Обратите внимание, что предположение о «практически

блоков с увеличением глубины

признаков. Каждый блок включает

полной независимости каналов признаков», лежащее в основе

два слоя раздельной свертки по глубине,

раздельной свертки, не выполняется для изображений RGB!

два слоя пакетной нормализации, слой

Каналы красного, зеленого и синего цветов на самом деле

объединения с выбором максимального

сильно коррелируют в естественных изображениях. Поэтому

значения из соседних и остаточную связь

первый слой в нашей модели — это обычный слой Conv2D. Слои

в обход всего блока

 

SeparableConv2D будут использоваться потом

328    Глава 9. Введение в глубокое обучение в технологиях зрения

Эта.сверточная.сеть.имеет.721.857.обучаемых.параметров.—.меньше,.чем.в.перво- начальной.модели,.где.обучаемых.параметров.было.991.041,.—.тем.не.менее. качество.ее.прогнозов.находится.на.аналогичном.уровне..На.рис..9.11.показаны. графики.изменения.точности.и.потерь.на.этапах.обучения.и.проверки.

Рис. 9.11. Графики изменения метрик на этапах обучения

и проверки для Xception-подобной архитектуры

Наша.новая.модель.достигла.точности.90,8.%.на.контрольных.данных,.что. существенно.лучше.83,5.%.у.первоначальной.модели.из.предыдущей.главы..