Давайте углубимся в архитектурные детали всех различных моделей EfficientNet и выясним, чем они отличаются друг от друга.
Я просматривал записные книжки в соревновании Kaggle и обнаружил, что почти все используют EfficientNet в качестве основы, о которой я не слышал до этого. Он представлен в этой статье Google AI, и они попытались предложить метод, который более эффективен, как следует из его названия, при этом улучшая современные результаты. Как правило, модели делаются слишком широкими, глубокими или с очень высоким разрешением. Повышение этих характеристик помогает модели на начальном этапе, но она быстро насыщается, и созданная модель просто имеет больше параметров и, следовательно, неэффективна. В EfficientNet они масштабируются более принципиально, т.е. постепенно все увеличивается.
Не понял в чем дело? Не волнуйтесь, вы увидите эту архитектуру. Но сначала давайте посмотрим, какие результаты они получили.
Благодаря значительно меньшему количеству параметров семейство моделей эффективно и дает лучшие результаты. Итак, теперь мы увидели, почему они могут стать стандартной предварительно обученной моделью, но чего-то не хватает. Я помню статью Рэйми Карима, в которой он показал архитектуры предварительно обученных моделей, и это очень помогло мне понять их и создать похожие архитектуры.
Так как я не смог найти такой в сети, я решил разобраться в нем и создать его для всех вас.
Общие вещи во всем
В первую очередь любая сеть - это ее основа, после чего начинается все экспериментирование с архитектурой, общее для всех восьми моделей и последних слоев.
После этого в каждом из них будет по 7 блоков. Эти блоки также имеют различное количество подблоков, количество которых увеличивается по мере перехода от EfficientNetB0 к EfficientNetB7. Чтобы посмотреть на слои моделей в Colab, напишите этот код:
!pip install tf-nightly-gpu import tensorflow as tf IMG_SHAPE = (224, 224, 3) model0 = tf.keras.applications.EfficientNetB0(input_shape=IMG_SHAPE, include_top=False, weights="imagenet") tf.keras.utils.plot_model(model0) # to draw and visualize model0.summary() # to see the list of layers and parameters
Если вы посчитаете общее количество слоев в EfficientNet-B0, то всего будет 237, а в EfficientNet-B7 - 813 !! Но не волнуйтесь, все эти слои могут состоять из 5 модулей, показанных ниже, и стебля вверху.
- Модуль 1 - используется в качестве отправной точки для подблоков.
- Модуль 2 - используется в качестве отправной точки для первого подблока из всех 7 основных блоков, кроме 1-го.
- Модуль 3 - подключается как пропускное соединение ко всем субблокам.
- Модуль 4 - используется для объединения пропуска соединения в первых подблоках.
- Модуль 5 - каждый субблок соединен со своим предыдущим субблоком в пропущенном соединении, и они объединяются с помощью этого модуля.
Эти модули далее объединяются в подблоки, которые будут определенным образом использоваться в блоках.
- Подблок 1 - используется только как первый подблок в первом блоке.
- Подблок 2 - используется как первый подблок во всех остальных блоках.
- Подблок 3 - используется для любого подблока, кроме первого, во всех блоках.
До сих пор мы указали все, что будет объединено для создания моделей EfficientNet, так что приступим.
EfficientNet-B0
EfficientNet-B1
EfficientNet-B2
Его архитектура такая же, как у вышеупомянутой модели, единственное различие между ними состоит в том, что количество карт функций (каналов) варьируется, что увеличивает количество параметров.
EfficientNet-B3
EfficientNet-B4
EfficientNet-B5
EfficientNet-B6
EfficientNet-B7
Легко увидеть разницу между всеми моделями, и они постепенно увеличивали количество подблоков. Если вы разбираетесь в архитектуре, я рекомендую вам взять любую модель, распечатать ее краткое изложение и просмотреть ее, чтобы узнать ее более тщательно. В приведенной ниже таблице указан размер ядра для операций свертки, а также разрешение, каналы и уровни в EfficientNet-B0.
Эта таблица была включена в исходный документ. Разрешение остается таким же, как и для всей семьи. Я не знаю, изменится ли размер ядра или останется прежним, поэтому, если кто-нибудь знает, оставьте ответ. Количество слоев уже указано выше на рисунках. Количество каналов различается, и оно рассчитывается на основе информации, полученной в сводке каждой модели, и представлено ниже (Если вы используете мобильное устройство, вам нужно будет просматривать его в альбомном режиме.)
╔═══════╦══════╦══════╦══════╦══════╦══════╦══════╦══════╗ ║ Stage ║ B1 ║ B2 ║ B3 ║ B4 ║ B5 ║ B6 ║ B7 ║ ╠═══════╬══════╬══════╬══════╬══════╬══════╬══════╬══════╣ ║ 1 ║ 32 ║ 32 ║ 40 ║ 48 ║ 48 ║ 56 ║ 64 ║ ║ 2 ║ 16 ║ 16 ║ 24 ║ 24 ║ 24 ║ 32 ║ 32 ║ ║ 3 ║ 24 ║ 24 ║ 32 ║ 32 ║ 40 ║ 40 ║ 48 ║ ║ 4 ║ 40 ║ 48 ║ 48 ║ 56 ║ 64 ║ 72 ║ 80 ║ ║ 5 ║ 80 ║ 88 ║ 96 ║ 112 ║ 128 ║ 144 ║ 160 ║ ║ 6 ║ 112 ║ 120 ║ 136 ║ 160 ║ 176 ║ 200 ║ 224 ║ ║ 7 ║ 192 ║ 208 ║ 232 ║ 272 ║ 304 ║ 344 ║ 384 ║ ║ 8 ║ 320 ║ 352 ║ 384 ║ 448 ║ 512 ║ 576 ║ 640 ║ ║ 9 ║ 1280 ║ 1408 ║ 1536 ║ 1792 ║ 2048 ║ 2304 ║ 2560 ║ ╚═══════╩══════╩══════╩══════╩══════╩══════╩══════╩══════╝
Medium не имеет никакого формата для создания таблиц, поэтому, если вы хотите создавать таблицы, подобные приведенной выше, вы создаете таблицы ASCII с этого сайта.
Прежде чем закончить, я снова приложил еще одно изображение из его исследовательской работы, которое показывает его эффективность по сравнению с другими современными методами, а также уменьшает количество параметров и количество требуемых FLOPS.
Если вы хотите создать подобную продвинутую архитектуру CNN или у вас возникли проблемы с пониманием каких-либо слоев или используемых терминов, не волнуйтесь, я написал статью, которая решит эти проблемы.
Хотите узнать, как EfficientNet соотносится с моделями в испытании Kaggle? Вы можете проверить эту статью.