Название VGG происходит от Visual GeoMetry Group, лаборатории, в которой работают авторы статьи. VGG предлагает, чтобыПовторное использование простых фундаментных блоковстроить глубокие модели.
блок ВГГ
Правило композиции блока VGG: последовательно используйте несколько сверточных слоев с отступом 1 и формой окна 3 × 3, за которыми следует слой максимального объединения с шагом 2 и формой окна 2 × 2. Сверточные слои сохраняют входную высоту и ширину постоянными, а объединяющие слои уменьшают их вдвое.
После каждого блока VGG высота и ширина выборки уменьшаются вдвое, а выходной канал удваивается. Пусть количество выходных каналов будетco
, количество входных каналовci
, высота и ширина образца равныh
иw
, высота и ширина ядра свертки равныkh
иkw
, прокладкаpadding
, размер шага равен 1. Можно сделать вывод, что форма ядра сверткиco*ci*kh*kw
, число взаимных операций равноco*ci*(h-kh+3)*(w-kw+3)
.
Отсюда видно, что количество взаимных операций иh*w*ci*co
пропорциональный. Этот вид ВГГпополам высота и ширина,двойной каналразработан таким образом, что большинство сверточных слоев имеют одинаковый размер параметра модели и вычислительную сложность.
сеть VGG
Сеть VGG состоит из модуля сверточного уровня, за которым следует модуль полносвязного уровня. Сеть VGG сначала полностью извлекает пространственные признаки с помощью модуля, состоящего из сверточных слоев, а затем выводит результаты классификации с помощью модуля, состоящего из полностью связанных слоев. Следующая сеть использует 8 сверточных слоев и 3 полносвязных слоя и называется VGG-11.
Sequential(
(vgg_block1): Sequential(
(0): Conv2d(1, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): ReLU()
(2): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
)
(vgg_block2): Sequential(
(0): Conv2d(64, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): ReLU()
(2): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
)
(vgg_block3): Sequential(
(0): Conv2d(128, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): ReLU()
(2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(3): ReLU()
(4): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
)
(vgg_block4): Sequential(
(0): Conv2d(256, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): ReLU()
(2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(3): ReLU()
(4): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
)
(vgg_block5): Sequential(
(0): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): ReLU()
(2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(3): ReLU()
(4): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
)
(fc): Sequential(
(0): FlattenLayer()
(1): Linear(in_features=25088, out_features=4096, bias=True)
(2): ReLU()
(3): Dropout(p=0.5, inplace=False)
(4): Linear(in_features=4096, out_features=4096, bias=True)
(5): ReLU()
(6): Dropout(p=0.5, inplace=False)
(7): Linear(in_features=4096, out_features=10, bias=True)
)
)
Принципы дизайна
В двумерном сверточном слое входная область, связанная с элементом x в выходном массиве, называетсяx«рецептивное поле». На рисунке 1 четыре заштрихованных элемента на входе представляют собой рецептивные поля заштрихованных элементов на выходе. Мы обозначаем выход 2 × 2 на рисунке 1 какY, и рассмотрим более глубокую сверточную сеть:YВыполните операцию взаимной корреляции с другим ядром свертки формы 2 × 2, чтобы вывести один элемент.z. Так,zсуществуетYРецептивное поле наYВсе четыре элемента , а рецептивное поле на входе включает все девять из них. Видишь, мы можемВосприимчивое поле одного элемента на карте объектов расширяется за счет более глубокой сверточной сети для захвата объектов большего размера на входе..
Рецептивное поле всего выхода сети ВГГ является всем входом, но по мере увеличения глубины сети рецептивное поле отдельного элемента становится все больше и больше. Использование сложенных небольших ядер свертки предпочтительнее использования больших ядер свертки при проектировании сети, потому что можно увеличить глубину сети, чтобы обеспечить изучение более сложных шаблонов.