Я не согласен с ответом @ user2255757 в комментариях, что это должно дать тот же ответ. TL; DR : Полностью связанные слои имеют индивидуальные веса для отдельных каналов, тогда как сверточные слои разделяют веса только своих ядер.
Позвольте мне объяснить:
Радиэтого аргумента я предполагаю, что мы имеем дело с каким-то результатом промежуточного слоя h
, который является вектором измерений 1 x N
(иначе весь объект полностью связанного слоя также не будет иметь места для начала)как ваше использование Conv1d
).
Из вашего описания я также прочитал, что вы хотите иметь один целевой выход, потенциально ограниченный [0,1]
.Соответствующий полностью связанный слой будет иметь структуру, аналогичную соединениям между вторым скрытым слоем и выходным слоем на изображении ниже.Как вы можете видеть, это содержит ровно четыре соединения, каждое из которых имеет свой собственный вес.Это означает, что вы можете выразить вычисление, которое происходит в этом слое, с помощью умножения матрицы, где матрица весов имеет форму [output dimension, input dimension], i.e. in our case this would be a
N x 1` «матрицы».Результирующее значение тогда уже находится в правильном формате вывода (1 значение).
С другой стороны, сверточный слой в Conv1d
состоит изодной руды больше фильтры .Ради аргумента мы рассмотрим PyTorch Conv1d
.Здесь мы видим, что мы можем указать in_channels
и out_channels
, но пока будем их игнорировать, поскольку в обоих случаях нам важен только один канал.
Более интересными являютсяпоследующие параметры: Как вы уже упоминали в своем вопросе, kernel_size
будет равно 1 для вашего примера.Это означает, что мы берем «коробку» размером 1 x 1
(вторичное измерение - просто пустышка для сравнения с полностью подключенным слоем), а затем «сдвигаем» это по входу, снова сравниваем изображение ниже, которое имеет размер ядра2.
Вот здесь и происходит реальная разница! Вместо N
различных весов для каждого отдельного входа предыдущего слоя, свертка делит один вес между всеми входами.Это означает, что выходное значение на самом деле является просто суммой Conv1d_weight * input[i]
.
. Конечно, MaxPool1d снова избавится от дополнительных измерений, но это происходит только путем выбора максимального значения, которое необязательно соотносится с тем, что имеет полностью связанный слой.