Аккаунт WeChat: ilulaoshi / Персональный сайт: lulaoshi.info
AlexNetНа базе LeNet добавлен сверточный слой, но AlexNet внесла много корректив в окно свертки, количество выходных каналов и порядок построения. Хотя AlexNet указал на превосходную производительность глубоких сверточных нейронных сетей, он не предоставил простых правил, которыми последующие исследователи могли бы руководствоваться при проектировании новых сетей.
Сеть VGG принадлежит Оксфорду.Visual Geometry GГруппа предложила, чтобы сеть VGG была аббревиатурой названия лаборатории. В документе VGG представлены некоторые из его выводов по проблеме ImageNet 2014, в которых предлагается, что глубокие модели могут быть построены путем повторного использования базовых блоков.
блок ВГГ
В целом правила построения базовых блоков CNN таковы:
- сверточный слой
- нелинейная функция активации, такая как ReLU
- Слой пула, такой как максимальный слой пула
Метод, предложенный в документе VGG, заключается в последовательном использовании нескольких идентичных сверточных слоев с отступом 1 и формой окна 3 × 3, за которыми следует слой максимального объединения с шагом 2 и формой окна 2 × 2. Сверточные слои сохраняют высоту и ширину ввода и вывода неизменными, в то время как объединяющие слои уменьшают размер ввода вдвое.
Для данного рецептивного поля (локальный размер входного изображения по отношению к выходному) использование сложенных небольших ядер свертки предпочтительнее использования больших ядер свертки, потому что увеличение глубины сети гарантирует, что сеть может изучать более сложные шаблоны, и вся модель имеет меньше параметров и стоимость относительно невелика.
Мы используемvgg_block()
Для реализации этого базового блока VGG этот метод имеет несколько параметров: количество сверточных слоев в блоке, количество входных и выходных каналов.
def vgg_block(num_convs, in_channels, out_channels):
'''
Returns a block of convolutional neural network
Parameters:
num_convs (int): number of convolutional layers this block has
in_channels (int): input channel number of this block
out_channels (int): output channel number of this block
Returns:
a nn.Sequential network:
'''
layers=[]
for _ in range(num_convs):
# (input_shape - 3 + 2 + 1) / 1 = input_shape
layers.append(nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1))
layers.append(nn.ReLU())
in_channels = out_channels
# (input_shape - 2 + 2) / 2 = input_shape / 2
layers.append(nn.MaxPool2d(kernel_size=2,stride=2))
return nn.Sequential(*layers)
сеть VGG
VGG похож на AlexNet и LeNet.Сеть VGG разделена на две части.Первая половина представляет собой сверточный уровень и модуль уровня пула, а вторая половина представляет собой модуль полносвязного уровня.
Модули сверточного слоя и слоя пула состоят из нескольких связанных основных блоков, а именноvgg_block()
Базовый блок, возвращаемый методом, нам просто нужно датьvgg_block()
Метод обеспечивает: количество сверточных слоев, содержащихся в блоке, количество входных и выходных каналов для блока. мы определяем переменныеconv_arch
, переменная — это список, каждый элемент в списке — это кортеж (список кортежей).conv_arch
Определяется количество сверточных слоев и количество входных и выходных каналов в каждом блоке ВГГ. Модуль полносвязного слоя такой же, как и в AlexNet. следующееvgg()
Метод вернет всю сеть VGG, входные параметрыconv_arch
.
def vgg(conv_arch):
'''
Returns the VGG network
Parameters:
conv_arch ([(int, int)]): a list which contains vgg block info.
the first element is the number of convolution layers this block have.
the latter element is the output channel number of this block.
Returns:
a nn.Sequential network:
'''
# The convolutional part
conv_blks=[]
in_channels=1
for (num_convs, out_channels) in conv_arch:
conv_blks.append(vgg_block(num_convs, in_channels, out_channels))
in_channels = out_channels
return nn.Sequential(
*conv_blks, nn.Flatten(),
# The fully-connected part
nn.Linear(out_channels * 7 * 7, 4096), nn.ReLU(), nn.Dropout(0.5),
nn.Linear(4096, 4096), nn.ReLU(), nn.Dropout(0.5),
nn.Linear(4096, 10))
Теперь построим сеть VGG. Он имеет 5 сверточных блоков, первые 2 блока используют один сверточный слой, а последние 3 блока используют двойной сверточный слой. Входных и выходных каналов первого блока соответственно 1 и 64. Количество входных каналов первого блока зависит от используемого набора данных.Количество каналов данных Fashion-MNIST равно 1. Для таких наборов данных, как ImageNet, количество входных каналов обычно 3. После этого количество выходных каналов каждый раз удваивается, пока не станет 512. Поскольку эта сеть использует 8 сверточных слоев и 3 полносвязных слоя, ее часто называют VGG-11.
На уровне кода определите переменныеconv_arch
, который содержит несколько кортежей в середине, первый элемент каждого кортежа — это количество сверточных слоев блока, а второй элемент — это количество выходных каналов.
conv_arch = ((1, 64), (1, 128), (2, 256), (2, 512), (2, 512))
net = vgg(conv_arch)
Процесс обучения модели в основном аналогичен тому, что LeNet и AlexNet использовали ранее. Исходный код был выпущен дляGitHub.
резюме
- VGG строит сеть с помощью нескольких базовых сверточных блоков. Базовый блок должен определить количество сверточных слоев и количество входных и выходных каналов.
- В документе VGG утверждается, что меньшие (например, 3 × 3) сверточные слои более эффективны, чем большие сверточные слои, потому что можно добавить больше слоев без слишком большого количества параметров.
использованная литература
- Simonyan, K., & Zisserman, A. (2014). Very deep convolutional networks for large-scale image recognition.
- 2 come.love/chapter_con…