Участвуйте в 23-м дне Ноябрьского испытания обновлений, узнайте подробности события:Вызов последнего обновления 2021 г.
нужно следоватьПрактическое глубокое обучение 6.1 Зачем нужны слои свертки | Вывод формулы сверткиСмотреть.
После толчка и демонстрации в первом разделе мы смогли получить, что выходная форма свертки зависит от входной формы и формы ядра свертки.
Размер ввода, размер ядра свертки, то размер вывода.
На самом деле, вдобавок к этому есть отступы и шаг, влияющие на размер ядра свертки.
набивка
Так называемый отступ — это добавление границ к изображению.
Теперь я добавляю границу в 1 пиксель снаружи изображения.
Тогда результат расчета будет изстать.
Добавление 1 пикселя с каждой стороны — это еще две строки и еще два столбца. Полученная матрица также имеет еще две строки и два столбца.
В общем, нам нужно установитьи, так что вход и выход имеют одинаковую высоту и ширину.
- p входная матрица
- k ядро свертки
Предположениенечетно, мы будем прокладывать по обеим сторонам высотыРяд.
есличетно, одна из возможностей - заполнить верхнюю часть вводаряд, отступ внизуРяд.
Сделайте то же самое для обеих сторон ширины заполнения.
Преимущество выбора нечетного числа состоит в том, что при сохранении пространственного измерения мы можем заполнить одинаковое количество строк сверху и снизу и одинаковое количество столбцов слева и справа.
для любого двумерного тензораX
, при удовлетворении:
- Размер ядра нечетный;
- Количество строк и столбцов заполнения одинаково для всех сторон;
- Вывод имеет ту же высоту и ширину, что и ввод
Тогда мы можем получить: вывод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)
, добавление двух кортежей является конкатенацией, а не добавлением чисел.
успехи
Шаг - это размер каждого хода. Раньше мы двигались по умолчанию на один шаг, а теперь мы двигаемся по умолчанию на два?
Тогда результат расчета будет изстать.
Обычно, когда вертикальный шаг, горизонтальный шаг, выходная форма
Если мы установими, выходная форма упрощается до. Идя дальше, если высота и ширина ввода кратны вертикальному и горизонтальному шагам, выходная форма будет.
conv2d = nn.Conv2d(1, 1, kernel_size=3, padding=1, stride=2)
comp_conv2d(conv2d, X).shape
>>py
torch.Size([3, 4])
Соединитесь с X в приведенном выше коде и установите шаг операции двумерного пересечения равным 2 как в горизонтальном, так и в вертикальном направлениях, чтобы результат также уменьшался и соответствовал формуле, полученной выше.
-
Подробнее о серии «Практическое глубокое обучение» см. здесь:Колонка «Практическое глубокое обучение» (juejin.cn)
-
Примечания Адрес Github:DeepLearningNotes/d2l(github.com)
Все еще в процессе обновления......