vak: (Default)
[personal profile] vak
Двумерная цифровая свёртка - основная математическая операция, на которой строятся нейронные сети. Среди программистов много хороших математиков, но про conv2d почему-то знают немногие. Хотя ничего сложного: умножай себе да суммируй.



С нейронными сетями принято возиться на Питоне. Conv2D в пакетах типа Keras или PyTorch - базовое понятие. Но что, если хочется поиграться со свёрткой на Си++? Тоже есть решение: метод convolve() класса Tensor в пакете Eigen.

Примерно так:
// Элементы в многомерных массивах могут располагаться по столбцам или по строкам. 
// Мы выбираем по строкам.
const auto layout = Eigen::RowMajor;

// Создаём входной тензор: четырёхмерный массив.
Eigen::Tensor<float, 4, layout> input(3, 3, 7, 11);

// Создаём так называемое ядро свёрки: двумерный массив.
Eigen::Tensor<float, 2, layout> kernel(2, 2);

// Создаём выходной тензор, здесь окажется результат свёртки.
Eigen::Tensor<float, 4, layout> output(3, 2, 6, 11);

// Определяем, по каким размерностям будем сворачивать.
Eigen::array<ptrdiff_t, 2> dims({1, 2});

// Выполняем свёртку.
output = input.convolve(kernel, dims);
Полностью смотрите здесь: eigen/convolve.cpp

Date: 2022-08-15 03:40 (UTC)
archaicos: Шарж (Default)
From: [personal profile] archaicos
Если коэффициентов в этих многомерных свёртках сотни миллионов, то оно считается на старых компуктерах непозволительно медленно. Речь не об одной свёртке небольшого размера же.

Date: 2022-08-15 04:45 (UTC)
From: [personal profile] dijifi
От того что коэффициентов сотни миллионов принцип свертки не меняется. 3х3 и 5х5 свертки как применялись для resampling, так и применяются.
Для того чтобы цеплять layers в tensorflow как свертка работает знать необязательно. Для переноса Tensorflow на новую архитектуру свертки нужно знать, но здесь непонятно где нужен плюсный темплатный Eigen.

Date: 2022-08-15 05:13 (UTC)
archaicos: Шарж (Default)
From: [personal profile] archaicos
Я про изменение принципов не говорил. Если медленно, то медленно, пофиг на принципы. Тут несколько проблем со скоростью на самом деле. Посчитать саму свёртку может быть и не слишком медленно (но, опять же, не на логарифмической линейке или на Z80 же считать такое), но разработать и натренировать модель – ещё более долгое удовольствие. Т.е. нужно технологически дорасти до того чтобы начать делать обе части быстро.

Date: 2022-08-15 06:12 (UTC)
From: [personal profile] dijifi
Ясен пень, что хотя CNN придумали лет сорок назад, популярность пришла только когда к массовым GPU 15 лет назад прикрутили надежную вычислялку (до этого было гэймер схавает).
Сам я в студенческие времена пытался свертки считать на 68000 и обломался.