Давайте углубимся в архитектурные детали всех различных моделей 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? Вы можете проверить эту статью.