首页 文章

tensorflow / tflearn输入形状

提问于
浏览
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:无法为Tensor u'TargetsData / Y:0'提供形状值(128,16,4),其形状为'(?,4)'

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

我无法理解输入和输出的形状应该是什么 . 感觉这应该是一件简单的事情 - 我有一组矢量输入序列,我希望网络尝试预测序列中的下一个 . 网上很少有人没有相当高级的知识水平,所以我遇到了一堵砖墙 . 非常感谢任何人都可以提供的见解!

1 回答

  • 3

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

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

    给定整个序列和所需的historyLength,我将输入分成historyLength和单个输出向量的序列 . 这解决了我的形状问题 .

相关问题