Играюсь с нейронными сетями. Свёрточными. Но не на всяких там Tensor Flow, а на С++. Со всей математикой с нуля. Та ещё задачка найти вменяемые описания того же обратного распространения в свёрточном слое. Но самое-то весёлое не это. Самое весёлое, это выполнение свёрток на GPU через матричное умножение. Почему через умножение? Потому что эта операция очень хорошо оптимизируется именно для GPU (блок 16x16 кладётся в кэш, общий для всех нитей блока и делается каждой нитью сложение с умножением кусочка). GPU я мучаю через мою любимую CUDA. Так вот, свёртка и обратная свёртка через умножение матриц делается вот так: Но кроме свёрток ещё нужно обновлять коэффициенты ядер. А это делается уже так: Только не надо строить эти матрицы заранее. Их легко можно (и нужно!) строить прямо «на лету». Сэкономите дофига памяти GPU.
А как эту свёртку применять в нейронке? А вот так: Здесь вверху показан прямой проход по сети (Image сворачивается с ядрами Kernel и получается тензор свёртки, с глу