如何使用具有3D分类输入和输出的LSTM神经网络?

时间:2018-05-22 18:45:32

标签: python tensorflow neural-network keras lstm

我试图使用Keras训练LSTM递归神经网络,该神经网络能够通过接收一系列音符来预测下一个音符。基本上我的数据集是这样的,我希望我的模型预测第五个音符:

     Note1     Note2     Note3    Note4  |  Note5

1   [A,2,#]   [B,3,b]   [C,4,#]  [A,2,b] | [B,3,b]

2   [B,2,#]   [B,2,b]   [B,5,#]  [A,2,#] | [A,3,#]

3   [C,2,#]   [B,5,#]   [A,4,#]  [A,1,#] | [A,8,b]

...

每个音符都是3个特征的数组,所有这些特征都是分类的。我很难理解如何使用这些信息为神经网络提供信息,因此欢迎任何有关如何处理数据或网络架构的代码帮助。提前谢谢。

1 个答案:

答案 0 :(得分:0)

您将需要找到一种编码,将您的数据转换为神经网络可以理解的格式。一种常见的方法是 one-hot encoding :假设你有7个音符(A,B,C ......)3个八度音阶(2,3,4)和尖锐的平坦中性音。随着一个热,这变成3个向量(7,); (3,); (3;)然后让[A,2,#] -> [1,0,0,0,0,0,0,1,0,0,1,0,0]将类别的索引设置为1.这只是一种方法,对于你有的注释你会创建一个矩阵(4,13), 4个音符编码为每个类别一个热点。

另一种方法是让每个音符都是唯一的,所以你会有一个向量(88,)告诉网络它会是什么音符,[A,2,#] -> [...0,0,1,0,0...]只有1个音符被设置。这会明显增加向量的大小,但应该使网络更明显 。但是现在88对于计算机来说仍然不是一个很大的数字。这就是magenta编码音符的方式,他们编码更多的东西,如时间等,以及更多的音乐生成动态。最后,您可以创建一个网络:

model = Sequential()
model.add(LSTM(some_hidden_number_units, input_shape=(4, 88)) # 4 past notes
model.add(Dense(88, activation='softmax')) # predict one of 88 notes
model.compile(loss='categorical_crossentropy', ...)