问题描述
我正在使用PyBrain训练音乐网络。 输入是两个音符,输出是接下来的两个音符。 每个音符由映射到音符的整数表示(EG C#= 11,F = 7),八度和持续时间。 所以我使用这样的数据集:
ds = SupervisedDataSet(6, 6)
看起来像([note1, octave1, duration1, note2, octave2, duration2], [note1, octave1, duration1, note2, octave2, duration2])
但是,我遇到了和弦问题(即一次演奏多个音符)。 为了解决这个问题,我摆脱了代表音符的第一个整数,将其替换为22个整数(分别设置为1或0),以指示正在播放的音符。 我仍然有八度和持续时间。 因此,例如,以下
[0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 4, 0.5]
表示C#,E和A的和弦,八度为4,持续时间为0.5。
经过培训和测试后,PyBrain始终为我提供全零的输出。
我知道为什么要这样做,但我不知道如何解决。
有没有更好的方式来表示音符/和弦,以使PyBrain不会遇到此问题?
编辑:我已经将位向量转换为十进制数,并且尽管网络不再只是给出零了,但仍然很清楚它没有正确学习模式。
我正在使用这样的网络:
net = buildNetwork(6, 24, 6, bias=True, hiddenclass=LSTMLayer, recurrent=True)
和这样的教练:
trainer = BackpropTrainer(net, ds, verbose = True)
当我训练时,我遇到了一个巨大的错误,大约是十万甚至十万。
1楼
您的问题对我来说不太清楚,我认为它需要更详细的解释,但是根据我的理解,我认为您不需要网络中的递归,还可以尝试在隐藏层中使用其他激活功能,例如Softmax
。
我在一些具有6个节点输入和6个输出的样本数据集上对其进行了测试,并且正在正确地进行训练,因此我建议您使用我的版本:
from pybrain.tools.shortcuts import buildNetwork
from pybrain.datasets import SupervisedDataSet
from pybrain.supervised.trainers import BackpropTrainer
from pybrain.structure.modules import SoftmaxLayer
ds = SupervisedDataSet(6, 6)
#
# fill dataset
#
net = buildNetwork(6, 24, 6, bias=True, hiddenclass=SoftmaxLayer)
trainer = BackpropTrainer(net, ds)
培养:
error = 10
while error > 0.00001: #choose error like you want
error = trainer.train()
print error #just for logging
#and activate
print net.activate([*,*,*,*,*,*])