我试图使用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个特征的数组,所有这些特征都是分类的。我很难理解如何使用这些信息为神经网络提供信息,因此欢迎任何有关如何处理数据或网络架构的代码帮助。提前谢谢。
答案 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', ...)