Возможно, вы ищете старую версию документации. 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
сверток. Это математически приводит к одной свертке (поскольку свертка свертки все еще является сверткой), но делает матрицу свертки «продукт» более разреженной и, таким образом, уменьшает количество параметров и вычислительную сложность. Этот кажется разумным ресурсом, объясняющим это более подробно.