Частота ошибок нейронной сети не увеличивается

Здесь новичок в нейронных сетях.
Я использую PyBrain, чтобы попытаться создать сеть, которая обучается музыке.
Мой набор данных состоит из примерно сотни песен, где вход для сети — две ноты, а цель — следующие две ноты. .
Каждая нота представлена ​​целым числом для комбинации нота/аккорд, целым числом для октавы ноты и плавающим числом для длительности ноты.
Моя сеть выглядит следующим образом:

    net = RecurrentNetwork()
    net.addInputModule(LinearLayer(6, name='in'))
    net.addModule(LSTMLayer(50, name='hidden1'))
    net.addModule(LSTMLayer(50, name='hidden2'))
    net.addOutputModule(LinearLayer(6, name='out'))
    net.addConnection(FullConnection(net['in'], net['hidden1'], name='c1'))
    net.addConnection(FullConnection(net['hidden1'], net['hidden2'], name='c3'))
    net.addRecurrentConnection(FullConnection(net['hidden2'], net['hidden1'], name='c4'))
    net.addConnection(FullConnection(net['hidden2'], net['out'], name='c5'))
    net.sortModules()

С таким набором данных и тренером:

ds = SupervisedDataSet(6, 6)
trainer = BackpropTrainer(net, ds, verbose = True, momentum = 0.01)

Моя проблема в том, что когда я тренирую сеть, я получаю огромную ошибку (например, 24569847209.8), которая никогда не уменьшается, она меняется с каждой эпохой, но всегда колеблется вокруг одного и того же числа.

После того, как сеть обучена, она создает песню, беря две случайные ноты в качестве входных данных, затем генерируя цель, затем передавая цель обратно в качестве входных данных и повторяя это снова и снова, пока не будет получена полная песня. Но я обнаружил, что все, что он когда-либо делает, это просто записывает вывод снова и снова, как будто он просто изучает одну фиксированную цель.

Я действительно не уверен, что не так с тем, что у меня есть, что вызывает это. Если есть какая-то информация, которую я должен включить, пожалуйста, дайте мне знать.


person FatUglyProud    schedule 24.02.2018    source источник
comment
Stackoverflow предназначен скорее для решения проблем с кодированием, чем для обучения людей использованию нейронных сетей. Многое может пойти не так при инициализации сети. Пока у вас действительно не возникнут проблемы с кодированием, спросите cs.stackexchange.com/questions/tagged/neural-networks или ai.stackexchange.com/questions/tagged/neural-networks или stats.stackexchange.com/questions/36247/   -  person Joe    schedule 24.02.2018
comment
Я не думаю, что согласен с этой оценкой. у меня есть код; есть проблема с этим. Я отредактировал свой вопрос и заголовок, чтобы устранить путаницу. Если вы чувствуете, что я упустил что-то важное, дайте мне знать.   -  person FatUglyProud    schedule 25.02.2018
comment
Возможно, ваша сеть просто не знает, что делать, потому что в песнях спрятано так много комбинаций двух нот. Вы можете попытаться перетренировать свою сеть всего несколькими очень похожими песнями. В этом случае сеть будет не угадывать, а запоминать/учить последовательность, и вы увидите, работает ли ваш подход в целом.   -  person Joe    schedule 26.02.2018
comment
@Joe запустил его только на одной песне (около 1000 или около того образцов пар нот) на 1000 эпох. Общая ошибка: 5660650926,69 в начале и Общая ошибка: 5563442152,03 в конце. Результат был один и тот же — одни и те же две ноты снова и снова. Я попытаюсь тренироваться еще больше, но мне кажется, что ошибка не должна быть такой высокой, во-первых, кажется смешным числом?   -  person FatUglyProud    schedule 27.02.2018
comment
Мне кажется, что ваша сеть просто не делает то, что вы думаете. Может быть, начнем с очень простого примера, возьмем массив из 50 чисел с 5 или около того синусов или косинусов и заставим вашу сеть угадывать их.   -  person Joe    schedule 27.02.2018


Ответы (1)


Кажется, я решил проблему с обучением! Моя сетевая ошибка теперь неуклонно уменьшается по мере того, как я ее тренирую! Я использовал неправильный тренажер. Поскольку я использую рекуррентную нейронную сеть, мне не следовало использовать тренер обратного распространения. Сейчас я использую RPropMinusTrainer. Чтобы исправить, следующая строка:

trainer = BackpropTrainer(net, ds, verbose = True, momentum = 0.01)

Был изменен на

trainer = RPropMinusTrainer(net, dataset=ds, verbose = True)
person FatUglyProud    schedule 01.03.2018