Что такое "линейная проекция" в сверточной нейронной сети

Я читаю Остаточное обучение, и у меня есть вопрос. Что такое "линейная проекция", упомянутая в 3.2? Выглядит довольно просто, как только получил это, но не мог понять...

Я в основном не специалист по информатике, поэтому я был бы очень признателен, если бы кто-нибудь привел мне простой пример.

Спасибо за любую помощь

2 ответа

Решение

Прежде всего, важно понять, что x, y а также F и зачем им вообще нужна какая-то проекция. Я постараюсь объяснить в простых терминах, но требуется базовое понимание ConvNets.

x является входными данными (называемыми тензорными) слоя, в случае ConvNets его ранг равен 4. Вы можете думать о нем как о 4-мерном массиве. F обычно это слой конвоя (conv+relu+batchnorm в этой статье), и y объединяет два вместе (образуя выходной канал). Результат F также имеет ранг 4, и большинство размеров будет таким же, как в x кроме одного. Это именно то, что трансформация должна исправить.

Например, x форма может быть (64, 32, 32, 3) где 64 - размер пакета, 32x32 - размер изображения, а 3 обозначает (R, G, B) цветовые каналы. F(x) возможно (64, 32, 32, 16): размер пакета никогда не меняется, для простоты ConV-слой ResNet также не меняет размер изображения, но, скорее всего, будет использовать другое количество фильтров - 16.

Итак, для того, чтобы y=F(x)+x быть действительной операцией, x должен быть "преобразован" из (64, 32, 32, 3) в (64, 32, 32, 16),

Я хотел бы подчеркнуть здесь, что "изменение" здесь не то, что numpy.reshape делает.

Вместо, x[3] дополняется 13 нулями, вот так:

pad(x=[1, 2, 3],padding=[7, 6]) = [0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0]

Если подумать, это проекция трехмерного вектора на 16 измерений. Другими словами, мы начинаем думать, что наш вектор такой же, но есть еще 13 измерений. Ни один из других x Размеры изменены.

Вот ссылка на код в Tensorflow, который делает это.

Линейная проекция - это та, в которой каждая новая функция представляет собой простую взвешенную сумму исходных объектов. Как и в статье, это можно представить умножением матрицы. если x это вектор N входные функции и W является M-отN матрица, то матричное произведение Wx доходность M новые функции, где каждый из них представляет собой линейную проекцию x, Каждый ряд W это набор весов, который определяет один из M линейные проекции (т. е. каждый ряд W содержит коэффициенты для одной из взвешенных сумм x).

В Pytorch (в частности, torchvision\models\resnet.py) в конце Узкого места у вас будет либо два сценария

  1. Каналы входного вектора x, скажем x_c (не пространственное разрешение, а каналы), меньше, чем равны выходному сигналу после слоя conv3 Узкого места, скажем, d измерений. Затем это может быть уменьшено путем свертки 1 на 1 с in planes = x_c и out_planes = d, с шагом 1, с последующей пакетной нормализацией, а затем происходит сложение F(x) + x, предполагая, что x и F (x) имеют такое же пространственное разрешение.

  2. Как пространственное разрешение x, так и его количество каналов не соответствуют выходным данным слоя BottleNeck, и в этом случае свертка 1 на 1, упомянутая выше, должна иметь шаг 2, чтобы как пространственное разрешение, так и количество каналов были совпадение для поэлементного сложения (снова с пакетной нормализацией x перед добавлением).

Другие вопросы по тегам