Практическое глубокое обучение 6.2 Отступы и шаги

глубокое обучение PyTorch

Участвуйте в 23-м дне Ноябрьского испытания обновлений, узнайте подробности события:Вызов последнего обновления 2021 г.


нужно следоватьПрактическое глубокое обучение 6.1 Зачем нужны слои свертки | Вывод формулы сверткиСмотреть.

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

Размер вводаm*nm*n, размер ядра сверткиa*ba*b, то размер выводаma+1*nb+1m-a+1*n-b+1.

На самом деле, вдобавок к этому есть отступы и шаг, влияющие на размер ядра свертки.

набивка

Так называемый отступ — это добавление границ к изображению.

image.png

Теперь я добавляю границу в 1 пиксель снаружи изображения.

Тогда результат расчета будет из3*63*6стать5*85*8.

Добавление 1 пикселя с каждой стороны — это еще две строки и еще два столбца. Полученная матрица также имеет еще две строки и два столбца.

В общем, нам нужно установитьph=kh1p_h=k_h-1иpw=kw1p_w=k_w-1, так что вход и выход имеют одинаковую высоту и ширину.

  • p входная матрица
  • k ядро ​​свертки

Предположениеkhk_hнечетно, мы будем прокладывать по обеим сторонам высотыph/2p_h/2Ряд.

еслиkhk_hчетно, одна из возможностей - заполнить верхнюю часть вводаph/2\lceil p_h/2\rceilряд, отступ внизуph/2\lfloor p_h/2\rfloorРяд.

Сделайте то же самое для обеих сторон ширины заполнения.

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

для любого двумерного тензораX, при удовлетворении:

  1. Размер ядра нечетный;
  2. Количество строк и столбцов заполнения одинаково для всех сторон;
  3. Вывод имеет ту же высоту и ширину, что и ввод

Тогда мы можем получить: выводY[i, j]введяX[i, j]Его получают вычислением кросс-корреляции с ядром свертки.

import torch
from torch import nn
conv2d = nn.Conv2d(1, 1, kernel_size=3, padding=1)

# 为了方便起见,我们定义了一个计算卷积层的函数。
# 此函数初始化卷积层权重,并对输入和输出提高和缩减相应的维数
def comp_conv2d(conv2d, X):
    # 这里的(1,1)表示批量大小和通道数都是1
    X = X.reshape((1, 1) + X.shape)
    Y = conv2d(X)
    # 省略前两个维度:批量大小和通道
    return Y.reshape(Y.shape[2:])

# 请注意,这里每边都填充了1行或1列,因此总共添加了2行或2列
X = torch.rand(size=(5, 8))
print(comp_conv2d(conv2d, X).shape)
>>
torch.Size([5, 8])
  • После операции свертки размер остается неизменным, и это по-прежнему тензор 5*8.
  • обратите внимание здесьX.reshape((1, 1) + X.shape), добавление двух кортежей является конкатенацией, а не добавлением чисел.

успехи

Шаг - это размер каждого хода. Раньше мы двигались по умолчанию на один шаг, а теперь мы двигаемся по умолчанию на два?

image.png

Тогда результат расчета будет из3*63*6стать2*32*3.

Обычно, когда вертикальный шагshs_h, горизонтальный шагsws_w, выходная форма(nhkh+ph+sh)/sh×(nwkw+pw+sw)/sw\lfloor(n_h-k_h+p_h+s_h)/s_h\rfloor \times \lfloor(n_w-k_w+p_w+s_w)/s_w\rfloor

Если мы установимph=kh1p_h=k_h-1иpw=kw1p_w=k_w-1, выходная форма упрощается до(nh+sh1)/sh×(nw+sw1)/sw\lfloor(n_h+s_h-1)/s_h\rfloor \times \lfloor(n_w+s_w-1)/s_w\rfloor. Идя дальше, если высота и ширина ввода кратны вертикальному и горизонтальному шагам, выходная форма будет(nh/sh)×(nw/sw)(n_h/s_h) \times (n_w/s_w).

conv2d = nn.Conv2d(1, 1, kernel_size=3, padding=1, stride=2)
comp_conv2d(conv2d, X).shape
>>py
torch.Size([3, 4])

Соединитесь с X в приведенном выше коде и установите шаг операции двумерного пересечения равным 2 как в горизонтальном, так и в вертикальном направлениях, чтобы результат также уменьшался и соответствовал формуле, полученной выше.


  1. Подробнее о серии «Практическое глубокое обучение» см. здесь:Колонка «Практическое глубокое обучение» (juejin.cn)

  2. Примечания Адрес Github:DeepLearningNotes/d2l(github.com)

Все еще в процессе обновления......