Comments 5
Вдруг кому пригодится.
Вот свёртка через умножение матриц.
Обновление коэффициентов ядер свёртки (для нейросетей).
Только не надо строить эти матрицы заранее. Их легко можно (и нужно!) строить прямо «на лету».
А вот так выглядит свёртка RGB-изображений нагрядно:
Здесь вверху показан прямой проход по сети (Image сворачивается с ядрами
Kernel и получается тензор свёртки, с глубиной равной количеству ядер).
В середине показан процесс вычисления поправок к элементам ядер, зная ошибку (Delta).
Ну а внизу показан процесс вычисления ошибок при обратном проходе через
свёрточный слой. Тут Delta предыдущего слоя сворачивается с повернутыми
на 180 ядрами.
А не подскажите источник таких картинок? Может есть какая-нибудь стоящая литература именно с пояснениями на матричном уровне
Да я их рисовал для себя, чтобы не запутаться.
Там пояснять особо нечего.
Например, по первой для прямой свёртки. Есть картинка размерностью [Ix,Iy,Iz]. Сворачиваем её N ядрами размерностью [Kx,Ky,Kz], при этом должно быть Iz=Kz. Чтобы такую свёртку сделать, нужно сделать умножение двух матриц. Первая - матрица ядер, она собирается по X как компоненты тензора каждого ядра. По Y такая матрица имеет размерность количества ядер. Вторая матрица - матрица изображения. Она собирается по X и Y как элементы изображения, для которых будут применяться ядра (так как ядра размерности Kz=Iz, то вертикаль делается для всех размерностей). Так как умножение матриц строка на столбец, это даёт ту самую свёртку.
А умножение матриц используется потому что эта операция очень хорошо оптимизирована для той же CUDA.
Картинка няшная. Но вот про паддинг... то что на первой картинке котя в траурной рамке заметят и поймут только те, кто zero padding уже знает. А на второй имеется в виду nearest neighbour? Для данной картинки лучше всего подошёл бы константный паддинг на цвет фона (на самом деле, надо знать выборку образцов).
Свертка