我正在尝试创建一个lstm来生成音乐序列。训练数据是大小为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:无法为具有形状'(?,4)形状的张量u‘’TargetsData/Y:0‘提供形状值(128、16、4)。
因此:到目前为止,我的假设是输入形状None,seqLength,4是对TF batchLength (按顺序输入),序列长度,样本的特征长度。我不明白的是,为什么它说输出的形状不对?我是不是错误地假设了数据序列的分裂?当我尝试在没有分裂成序列的情况下输入我的所有数据,所以输入形状是None,4,TF告诉我LSTM层期望一个至少三维的输入形状。
我无法理解输入和输出的形状。感觉这应该是一件简单的事情--我有一组向量的输入序列,我想让网络尝试预测序列中的下一个向量。几乎没有什么网络不具备相当先进的知识水平,所以我碰到了一堵砖墙。真的很感激任何人都能给出的洞察力!
发布于 2016-04-11 11:14:29
我解决了这个问题,所以我在这里为有同样问题的人写答案。这是基于对这些网络如何工作的错误理解,但在我读过的大多数教程中,这都是假定的知识,因此其他初学者可能不太清楚。
LSTM网络对于这些情况很有用,因为它们可以考虑输入历史。历史赋予LSTM的方式是通过排序,但是每个序列仍然导致一个输出数据点。因此,输入必须是三维形状,而输出只是2D。
给定一个完整的序列和一个期望的historyLength,我将输入分成historyLength序列和一个输出向量。这解决了我的体型问题。
https://stackoverflow.com/questions/36519138
复制相似问题