Таким образом, большинство руководств по CNN объясняют свертку в одном измерении как серию одномерных ядер, свертываемых с вашей входной последовательностью (как и традиционные фильтры FIR). Однако, насколько я понимаю, по умолчанию conv1d реализует свертку по всем вашим каналам для каждого вывода (по сути, двумерная свертка). Если желательна реализация традиционного КИХ-фильтра, вы должны указать groups = in_channels.
Проверка весов, похоже, подтверждает это:
from torch import nn
C1 = nn.Conv1d(in_channels=3, out_channels=6, kernel_size=7)
C2 = nn.Conv1d(in_channels=3, out_channels=6, kernel_size=7,groups=3)
C3 = nn.Conv2d(in_channels=3, out_channels=6, kernel_size=7)
C4 = nn.Conv2d(in_channels=3, out_channels=6, kernel_size=7, groups=3)
print(C1.weight.shape, '<-- 6 filters which convolve across two dimensions')
print(C2.weight.shape, '<-- 6 filters which convolve across one dimensions')
print(C3.weight.shape, '<-- 6 filters which convolve across three dimensions')
print(C4.weight.shape, '<-- 6 filters which convolve across two dimensions')
дает следующий результат:
torch.Size([6, 3, 7]) <-- 6 filters which convolve across two dimensions
torch.Size([6, 1, 7]) <-- 6 filters which convolve across one dimensions
torch.Size([6, 3, 7, 7]) <-- 6 filters which convolve across three dimensions
torch.Size([6, 1, 7, 7]) <-- 6 filters which convolve across two dimensions
Я ошибаюсь в этом наблюдении?
Если верно, я считаю, что наименование conv1d довольно сбивает с толку, поскольку подразумевает 1-мерную свертку.