2

我正在尝试创建一个 lstm-rnn 来生成音乐序列。训练数据是大小为 4 的向量序列,表示要训练的某些歌曲中每个音符的各种特征(包括 MIDI 音符)。

从我的阅读来看,看起来我正在尝试对每个输入样本进行处理,输出样本是下一个大小为 4 的向量(即,它应该尝试在给定当前音符的情况下预测下一个音符,并且由于LSTM 结合了以前的样本知识)。

我正在使用 tflearn,因为我对 RNN 还是很陌生。我有以下代码

net = tflearn.input_data(shape=[None, seqLength, 4])
net = tflearn.lstm(net, 128, return_seq=True)
net = tflearn.dropout(net, 0.5)
net = tflearn.lstm(net, 128)
net = tflearn.dropout(net, 0.5)
net = tflearn.fully_connected(net, 4, activation='softmax')
net = tflearn.regression(net, optimizer='adam',
                     loss='mean_square')

# Training
model = tflearn.DNN(net, tensorboard_verbose=3)
model.fit(trainX, trainY, show_metric=True, batch_size=128)

在此代码之前,我将 trainX 和 trainY 拆分为长度为 20 的序列(任意地,但我在某处读到,对这样的序列进行训练是一种很好的方法)。

这似乎很好,但我收到错误 ValueError: Cannot feed value of shape (128, 16, 4) for Tensor u'TargetsData/Y:0',其形状为 '(?, 4)'

SO:到目前为止,我的假设是输入形状 [None, seqLength, 4] 对 TF [batchLength(由 tflearn 顺序输入)、序列长度、样本的特征长度] 说。我不明白为什么它说输出是错误的形状?我是否错误地假设了数据序列拆分?当我只是尝试输入所有数据而不拆分为序列时,输入形状为 [None, 4],TF 告诉我 LSTM 层需要一个至少具有 3 维的输入形状。

我无法理解输入和输出的形状应该是什么。感觉这应该是一件简单的事情——我有一组向量输入序列,我希望网络尝试预测序列中的下一个。很少有在线课程不具备相当高级的知识水平,所以我碰了壁。非常感谢任何人可以提供的任何见解!

4

1 回答 1

3

我解决了这个问题,所以我在这里为任何有同样问题的人写答案。这是基于对这些网络如何工作的误解,但这是我读过的大多数教程中假定的知识,因此其他初学者可能不清楚。

LSTM 网络对这些情况很有用,因为它们可以考虑输入历史。将历史记录提供给 LSTM 的方式是通过排序,但每个序列仍会导致单个输出数据点。所以输入必须是 3D 形状,而输出只是 2D。

给定整个序列和所需的历史长度,我将输入拆分为历史长度序列和单个输出向量。这解决了我的形状问题。

于 2016-04-11T11:14:29.957 回答