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
This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

If you are unable to use this captcha for any reason, please contact us by email at support@dreamwidth.org