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-12 21:58 (UTC)
juan_gandhi: (Default)
From: [personal profile] juan_gandhi

Я, кстати, не понимаю этого обсещена со сверткой; известна уже 60 лет как, применялась к обработке цифровых фоток, и чо?

Date: 2022-08-12 22:11 (UTC)
archaicos: Шарж (Default)
From: [personal profile] archaicos
Ну, технологии дошли до того чтобы на них строить что-то полезное и доступное.
Хотя, некоторые пытаются на этом (и на сракчейне) построить вообще всё.

Date: 2022-08-12 22:32 (UTC)
From: [personal profile] dijifi
Да вы что, ребята? Только сейчас полезное и доступное? А как вы думаете чем разрешение цифрофоточек можно менять, чтобы результат выглядел прилично?

Date: 2022-08-12 23:32 (UTC)
juan_gandhi: (Default)
From: [personal profile] juan_gandhi

Галуа вообще загадочный пацан. Не он бы, атомной бомбы, может быть, не было бы.

Date: 2022-08-13 02:42 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Как же, как же, команду pnmconvol из пакета PBMPLUS с детства помню.

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 и обломался.