Как быть с коэффициентом момента при переносе свёрточной нейронной сети на GPU

Надеюсь, объёмность вопроса вас не отпугнёт :) Прошу, прочитайте полностью и помогите чем сможете, буду очень благодарен!

Решил я тут сделать свёрточную нейронную сеть, а точнее синтезирующую изображения. Вроде сделал, всё работает, но на CPU производительности хватает лишь на изображения максимум 100 на 100 пикселей. Поэтому я стал переносить её на GPU(если кому поможет, то делаю я на c++, для переноса на GPU юзаю OpenCL). Перенести распространение значений и ошибки не составило особого труда, но чтобы распараллелить веса, пришлось немного подумать. Вообщем, я решил, что создам матрицу всех дельт, и для каждого значения этой матрицы дельт рассчитаю значения, соответствующие каждой из позиций движущегося ядра по карте признаков. Проще говоря, я просто взял каждую возможную дельту для определённой картинки, и записал отдельно в один большой буфер. Потом сложил все дельты, принадлежащие определённому весу, между собой и в конечном счёте сложил их с самим ядром. Но при таком подходе, не удаётся учитывать коэффициент момента, так как прошлая дельта должна изменяться при каждом смещении ядра, а у меня все дельты рассчитываются одновременно(на GPU же :D ), из за чего невозможно использовать прошлую дельту определённого веса, ведь она в этот же момент рассчитывается в другом ядре GPU(шейдере, если удобно). Если же не использовать распараллеливание при подсчёте дельт, то слишком сильно падает прирост скорости при обработке на GPU? Неужели мне просто придётся рассчитывать эту часть обучения на CPU? Есть ли какие нибудь более адекватные способы решения? Кароче, help me :(

P.S Такая сеть в целом может обучаться рисовать, но очень долго и не качественно((

И ещё, я тут поставлю картинку архитектуры моей сети, шоб по красочней вопрос был :) Архитектура моей сети


Ответы (0 шт):