2022-08-12

vak: (Default)
Двумерная цифровая свёртка - основная математическая операция, на которой строятся нейронные сети. Среди программистов много хороших математиков, но про 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
vak: (Default)
Меня давно интересовало, откуда взялись хардверные регистры, главный механизм хранения битов информации. В электронике они обозначаются термином D-flip-flop, по русски часто называют D-триггер. Буковка D в названии значащая, так как существуют флип-флопы и триггеры других видов.

Есть в этом гейте некоторая магия. Дальше )