首页 > 解决方案 > 如何使用具有 3D 分类输入和输出的 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 个特征的数组,它们都是分类的。我正在努力理解如何为神经网络提供这些信息,因此欢迎提供有关如何处理数据或网络架构的代码的任何帮助。提前致谢。

标签: pythontensorflowneural-networkkeraslstm

解决方案


您将需要找到一种编码,将您的数据转换为神经网络可以理解的格式。一种常见的方法是单热编码:假设您有 7 个音符 (A,B,C...) 3 个八度音阶 (2,3,4) 和锐利平坦的中性。使用 one-hot 这变成 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 仍然不是一个很大的数字。这就是洋红色对音符的编码方式,它们编码更多的东西,如时间等,以及更多的音乐生成动态。最后,您可以创建一个网络:

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', ...)

推荐阅读