我正在使用PyBrain来训练音乐网络。输入是两个音符,输出是接下来的两个音符。 每个音符由映射到音符的整数(E.G C#= 11,F = 7),八度音程和持续时间表示。所以我正在使用数据集:
ds = SupervisedDataSet(6, 6)
看起来像([note1, octave1, duration1, note2, octave2, duration2], [note1, octave1, duration1, note2, octave2, duration2])
然而,我遇到了和弦问题(I.E一次播放多个音符)。为了解决这个问题,我摆脱了表示音符的第一个整数,并用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)
当我训练时,我遇到了一个巨大的错误,比如十或十万。
答案 0 :(得分:0)
你的问题对我来说不是那么清楚,我认为它需要更详细的解释,但依赖于我的理解我认为你不需要在你的网络中重新学习,也试图在隐藏层中使用另一个激活功能,例如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([*,*,*,*,*,*])