【问题标题】:Neural Network Data Sparsity神经网络数据稀疏
【发布时间】:2018-07-21 19:26:38
【问题描述】:

我正在使用 PyBrain 训练音乐网络。输入是两个音符,输出是接下来的两个音符。 每个音符由映射到音符的整数表示(例如,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)

当我训练时,我遇到了一个巨大的错误,大概是十万或十万。

【问题讨论】:

  • 请给我一个更详细的解释,我离音乐和这个八度音阶和 C#s 太远了,所以请编辑你的问题,并写下你如何训练你的网络,你使用哪个网络等
  • @Godot 我在原始帖子中添加了更多信息。就音乐术语而言,我会说这并不重要。基本上你可以想象我有 22 个灯——我用 22 个二进制值表示开/关,一个 int 表示亮度,一个 float 表示持续时间。我遇到的问题是,因为每个样本中 22 个灯中的大多数都将关闭,所以我的网络认为永远不应该有任何灯亮着。我希望这可以澄清!

标签: python neural-network pybrain


【解决方案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([*,*,*,*,*,*])

【讨论】:

    猜你喜欢
    • 2017-02-20
    • 2016-08-03
    • 2016-07-26
    • 2017-05-10
    • 1970-01-01
    • 1970-01-01
    • 2012-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多