Я недавно прочитал комментарий Яна ЛеКуна о свертках 1x1 :
В Сверточных Сетях не существует такого понятия, как «полностью связанные слои». Существуют только слои свертки с ядрами свертки 1x1 и полной таблицей соединений.
Это слишком редко понимаемый факт, что ConvNets не должен иметь вход фиксированного размера. Вы можете обучить их на входах, которые производят один выходной вектор (без пространственного экстента), а затем применить их к большим изображениям. Вместо одного выходного вектора вы получите пространственную карту выходных векторов. Каждый вектор видит входные окна в разных местах на входе. В этом сценарии «полностью связанные слои» действительно действуют как свертки 1x1.
Я хотел бы увидеть простой пример для этого.
пример
Предположим, у вас есть полностью подключенная сеть. Он имеет только входной слой и выходной слой. Входной слой имеет 3 узла, выходной слой имеет 2 узла. Эта сеть имеет параметров. Чтобы сделать его еще более конкретным, допустим, у вас есть функция активации ReLU в выходном слое и матрице весов.
Таким образом, сеть с .
Как сверточный слой должен выглядеть одинаково? Что означает LeCun с «полной таблицей соединений»?
Я думаю, чтобы получить эквивалентный CNN, он должен иметь точно такое же количество параметров. MLP сверху имеет параметров.
источник
kernel = filter
ты согласен? >> "Так что свертка 1x1 касается только вывода, а не ядра? Совсем нет.3x3
Свертка может иметь произвольную форму вывода." Действительно, если используется заполнение, аstride=1
затем -output shape = input shape
. >> «Я думал, что если ядро свертки имеет форму [1, 1, 3], то можно сказать, что это свертка 1x1x3?» Нет, я никогда не слышал, чтобы кто-то говорил о3x3x512
свертках. Однако все сверточные фильтры, которые я видел, имеют третье пространственное измерение, равное количеству карт характеристик входного слоя.Convolution Demo
ознакомьтесь с курсом Karpathies CS321n: cs231n.github.io/convolutional-networks/#conv . Или в API-интерфейсе tennsflow: tennsflow.org/versions/r0.9/api_docs/python/nn.html#conv2d Фильтры должны иметь форму[filter_height, filter_width, in_channels, out_channels]
.( Источник )
источник
Эквивалентное ядро просто имеет любую форму на входе и вычисляет произведение тензорной точки. (Я использую слово «форма», так как кажется, что существует некоторая путаница с «размером», которая часто игнорирует измерение канала / глубины). В этом нет никакого «скольжения ядра по входным данным», поскольку ядро настолько велико, насколько это возможно. Цитировать Stanford CS 231n примечания к курсу :
Я считаю, что «F = 7, P = 0, S = 1, K = 4096, F = 7, P = 0, S = 1, K = 4096» здесь означает, что каждое ядро конвоя имеет форму 7x7x512, и таких фильтров 4096.
В предыдущем ответе упоминалось, что последний фк AlexNet (который получает входные данные в форме 1x1x4096 и вычисляет 1000 баллов за класс) реализован как "свертка 1x1". Чтобы быть завершенным, каждое такое ядро имеет форму 1x1x4096, и их 1000.
Ле Канн также объясняет это в статье CNN , стр. 8, описание LeNet5:
источник
Любому новичку в PyTorch, как я , не путайте «полностью связанный слой» с «линейным слоем».
Линейный слой и свертки 1x1 - это одно и то же. Мне потребовалось некоторое время, чтобы понять, что не существует такого понятия, как «полностью связанный слой» - это просто сглаживание пространственных измерений в одномерный гигантский тензор. Выравнивание приводит к тому, что каждый элемент во всех пространственных местоположениях будет представлен как отдельная карта объектов / канал / измерение (как бы вы это ни называли). Следовательно, когда мы накладываем линейный слой на сплющенный тензор , мы получаем полностью связную операцию, которая, очевидно, не совпадает со сверткой 1x1.
1x1
Другие ответы, которые утверждают, что полностью связанный слой является просто допустимым
nxn
сверточным слоем для ввода размераnxn
, сбивают с толку (хотя и правильно).источник