python - 如何使用具有 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 个特征的数组,它们都是分类的。我正在努力理解如何为神经网络提供这些信息,因此欢迎提供有关如何处理数据或网络架构的代码的任何帮助。提前致谢。
解决方案
您将需要找到一种编码,将您的数据转换为神经网络可以理解的格式。一种常见的方法是单热编码:假设您有 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', ...)
推荐阅读
- angularjs - 如果进度条为 100%,AngularJS 删除“活动”类
- python - Python 3 web scraper 非常简单不工作
- python - 如何通过比较另一个数据框中的值来为数据框的列分配值
- delphi - 在delphi中自动增加轨迹栏的过程
- python - Python3:从给定时间播放音频文件
- python - 为什么 day_num 没有定义?
- r - emmeans 无法在 R 中处理类“bigglm”的对象
- python - 无法通过 Facebook Graph API 获取任何事件
- python - 我是给 cross_val_score() 整个数据集还是只给训练集?
- flutter - Flutter StatefulWidget 层次结构