Как работает downsample в ResNet в коде pytorch? - PullRequest
0 голосов
/ 15 апреля 2019

В этом примере кода ResNet Pytorch они определяют downsample как переменную в строке 44. а строка 58 использует его в качестве функции. Как этот нисходящий пример работает здесь как точка зрения CNN и как точка зрения кода Python.

пример кода: pytorch ResNet

Я искал, является ли downsample какой-либо встроенной функцией pytorch. но это не так.

class BasicBlock(nn.Module):
    expansion = 1

    def __init__(self, inplanes, planes, stride=1, downsample=None, groups=1, norm_layer=None):
        super(BasicBlock, self).__init__()
        if norm_layer is None:
            norm_layer = nn.BatchNorm2d
        if groups != 1:
            raise ValueError('BasicBlock only supports groups=1')
        # Both self.conv1 and self.downsample layers downsample the input when stride != 1
        self.conv1 = conv3x3(inplanes, planes, stride)
        self.bn1 = norm_layer(planes)
        self.relu = nn.ReLU(inplace=True)
        self.conv2 = conv3x3(planes, planes)
        self.bn2 = norm_layer(planes)
        self.downsample = downsample
        self.stride = stride

    def forward(self, x):
        identity = x

        out = self.conv1(x)
        out = self.bn1(out)
        out = self.relu(out)

        out = self.conv2(out)
        out = self.bn2(out)

        if self.downsample is not None:
            identity = self.downsample(x)

        out += identity
        out = self.relu(out)

return out

Ответы [ 3 ]

1 голос
/ 15 апреля 2019

Если вы посмотрите на оригинальную бумагу ResNet (http://openaccess.thecvf.com/content_cvpr_2016/papers/He_Deep_Residual_Learning_CVPR_2016_paper.pdf)), они используют пошаговые свертки для уменьшения выборки изображения. Основной путь автоматически сокращается с использованием этих забитых сверток, как это делается в вашем коде. Остаточный путь использует либо (a) отображение идентификаторов с добавлением нулевых записей для добавления дополнительных параметров или (b) свертка 1x1 с тем же параметром шага.

Второй вариант может выглядеть следующим образом:

if downsample:
    self.downsample = conv1x1(inplanes, planes, strides)
0 голосов
/ 16 апреля 2019

В этом примере ResNet, здесь, когда мы определяем класс BasicBlock, мы передаем downsample в качестве параметра конструктора.

def __init__(self, inplanes, planes, stride=1, downsample=None, groups=1, norm_layer=None):

, если мы ничего не передаем классу, тогда downsample = None, как результат identity не изменится.

Когда мы передадим downsample = "some convolution layer" в качестве аргумента конструктора класса, он будет понижать идентичность через пройденный слой свертки, чтобы успешно выполнить сложение.этот слой уменьшит идентичность через код, как упоминалось

  if self.downsample is not None:
        identity = self.downsample(x)
0 голосов
/ 15 апреля 2019

Я считаю, что в этом контексте это может быть средний или максимальный пул.Они оба уменьшают размерность и сохраняют большинство свойств ввода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...