Пишу свой инструментарий для создания нейросетей. FeedForward модели на нём учатся нормально (часто довольно медленно, свёрточный классификатор рисованных нулей-единиц размера 30*30 может учиться до минуты, но меня это устраивает). Проблемы начинаются, когда я пытаюсь реализовать GAN. Распространение ошибок и прочее работает правильное, но обучение ни к чему не приводит. Пытался обучить на примерно 300 вручную нарисованных окружностях, в качестве выборок брал случайные поднаборы размера от 5 до 200, методы оптимизации так же перепробовал все, что только мог, ждал достаточно долго - до 2 часов, пробовал разные архитектуры, перенастраивал операции pool и т.п., как советуют - ничего не выходит. Пришёл к выводу, что нужно использовать batchNorm, но в моей реализации он невозможен, т.к. прогонка вычислений по нейросети проходит только для одного значения одновременно. (а чтобы это исправить нужно будет исправлять примерно 4к строк кода либо писать заново). Так вот - действительно ли дело может быть в отсутствии batchnorm? Если нет, то какие оптимальные архитектуры генератора и дискриминатора и методы оптимизации градиентного спуска необходимо использовать? И почему?
Ну в вашем случае просто batch = 1. А чтобы понять нужен или нет, посмотрите, что у вас на выходе у слоя, такая ли большая разница между разными входными данными.
freeExec, у меня не совсем batch = 1., у меня batch произвольного размера, т.к. градиент считается всё равно суммарный, просто считается не всё параллельно, а по очереди. На старте обучения фотографии на выходе генератора получаются почти монотонные. Также ещё проверил на примитивных данных (просто один скаляр) - он учится относительно нормально на перцептронах (порядка 20к итераций наборами по 5 значений), если давать, как пример значения из одного диапазона, но если давать из двух диапазонов - уже не учится.
FeedForward (это те, что полносвязные) практически тупиковый путь. Посчитайте сколько вы весов заложили в свою нейросеть. Для картинок пробуйте сверточные нейросети.
А разве FeedForward - обязательно полносвязная? Я подразумевала, что у меня нейросети имеют простую архитектуру и все слои (слои сложения, умножения на матрицу, свёртки, применения функций) вычисляются строго поочерёдно и ровно единожды. В любом случае, спасибо за ответ, хотя уже и поздно. Я поняла, что для нейросетей была слишком неопытна и мне не стоило писать подобие библиотеки для них на плюсах без должного знания языка и библиотек для математики (от которых по глупости решила отказаться).
Написание собственных библиотек слишком затратно по времени (слишком!), особенно когда есть хорошие бесплатные альтернативы. К сожалению я по неопытности тоже написал свой велосипедик (реализацию обучения деревья решений).
imageman, Да, я знаю, что такое свёрточные слои и свёрточная нейросеть. Она в GAN и была использована. А насчёт бесплатных альтернатив - это всё равно не так интересно (ведь всё это делалось, как досуг, а не как что-то коммерческое), но если есть какая-то библиотека на c++, которая позволяет использовать свёртку/развёртку (желательно вместе с другими операциями типа pool) и, соответственно, применять к ней шаг backpropagation, то хотелось бы узнать - какая? (если не считать opencv, т.к. там уже реализовано и всё остальное для нейросетей)
imageman, из всего этого только значения градиентов не отслеживала. Оптимизатор использовала adam и его варианты, gan всё равно обучался очень плохо - у него выходные значения имели сильную дисперсию. Думаю, не стоит подобным заниматься без батчей, к тому же без них и скорость сильно падает. В любом случае, в ваших ответах много полезного, обозначу их как правильные.