Группы в сверточной нейронной сети / CNN - PullRequest
1 голос
/ 12 марта 2019

Я наткнулся на этот пример PyTorch для глубинно разделимых сверток, используя параметр groups :

class depthwise_separable_conv(nn.Module):
    def __init__(self, nin, nout):
        super(depthwise_separable_conv, self).__init__()
        self.depthwise = nn.Conv2d(nin, nin, kernel_size=3, padding=1, groups=nin)
        self.pointwise = nn.Conv2d(nin, nout, kernel_size=1)

    def forward(self, x):
        out = self.depthwise(x)
        out = self.pointwise(out)
        return out

Я не видел никакого использования групп в CNN раньше. Документация также немного скудна в этом отношении:

groups контролирует соединения между входами и выходами. in_channels и out_channels должны делиться на группы.

Итак, мои вопросы:

  • Что такое группы в CNN?
  • В каких случаях мне нужно использовать группы?

думаю это скорее общее, а не специфичное для PyTorch.)

1 Ответ

1 голос
/ 12 марта 2019

Возможно, вы ищете старую версию документации. 1.0.1 документация для nn.Conv2d расширяется на этом.

Группы контролируют соединения между входами и выходами. in_channels и out_channels должны делиться на группы. Например,

При группах = 1 все входы свернуты для всех выходов.

При группах = 2 эта операция становится эквивалентной наличию двух параллельных слоев, каждый из которых видит половину входных каналов, и создает половину выходных каналов, и оба впоследствии объединяются.

При groups = in_channels каждый входной канал свернут с собственным набором фильтров размером: (floor(c_out / c_in))

Если вы предпочитаете более математическое описание, начните с мысли о свертке 1x1 с groups=1 (по умолчанию). По сути это полная матрица, применяемая ко всем каналам f в каждом (h, w) местоположении. Установка более высоких значений для groups превращает эту матрицу в диагонально-разреженную блочную матрицу с числом блоков, равным groups. С groups=in_channels вы получаете диагональную матрицу.

Теперь, если ядро ​​больше 1x1, вы сохраняете разреженность блоков по каналам, как указано выше, но допускаете более крупные пространственные ядра. Я предлагаю перечитать groups=2 освобождаемый от документов, которые я цитировал выше, он точно описывает этот сценарий еще одним способом, возможно полезным для понимания. Надеюсь, это поможет.

Редактировать : Почему кто-то хочет его использовать? Либо как ограничение (ранее) для модели, либо как метод повышения производительности; иногда оба. В связанной ветке идея состоит в том, чтобы заменить NxN, groups=1 2d свёрток на последовательность NxN, groups=n_features -> 1x1, groups=1 сверток. Это математически приводит к одной свертке (поскольку свертка свертки все еще является сверткой), но делает матрицу свертки «продукт» более разреженной и, таким образом, уменьшает количество параметров и вычислительную сложность. Этот кажется разумным ресурсом, объясняющим это более подробно.

...