Что такое "линейная проекция" в сверточной нейронной сети
Я читаю Остаточное обучение, и у меня есть вопрос. Что такое "линейная проекция", упомянутая в 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) в конце Узкого места у вас будет либо два сценария
Каналы входного вектора x, скажем x_c (не пространственное разрешение, а каналы), меньше, чем равны выходному сигналу после слоя conv3 Узкого места, скажем, d измерений. Затем это может быть уменьшено путем свертки 1 на 1 с in planes = x_c и out_planes = d, с шагом 1, с последующей пакетной нормализацией, а затем происходит сложение F(x) + x, предполагая, что x и F (x) имеют такое же пространственное разрешение.
Как пространственное разрешение x, так и его количество каналов не соответствуют выходным данным слоя BottleNeck, и в этом случае свертка 1 на 1, упомянутая выше, должна иметь шаг 2, чтобы как пространственное разрешение, так и количество каналов были совпадение для поэлементного сложения (снова с пакетной нормализацией x перед добавлением).