tensorflow/tflearn 输入形状
tensorflow/tflearn input shape
我正在尝试创建一个 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 的序列(任意,但我在某处读到,对这样的序列进行训练是执行此操作的好方法)。
这似乎没问题,但我收到错误值错误:无法为 Tensor u'TargetsData/Y:0' 提供形状值 (128, 16, 4),其形状为 '(?, 4 )'
SO:到目前为止,我的假设是输入形状 [None, seqLength, 4] 对 TF [batchLength(由 tflearn 按顺序提供)、序列长度、样本的特征长度]说.我不明白的是为什么它说输出的形状错误?我是否错误地假设了数据序列拆分?当我只是尝试在不拆分成序列的情况下输入所有数据时,因此输入形状为 [None, 4],TF 告诉我 LSTM 层期望输入形状至少具有 3 个维度。
我不知道输入和输出的形状应该是什么。感觉这应该是一件简单的事情——我有一组输入向量序列,我希望网络尝试预测序列中的下一个。网上几乎没有不具备相当高级知识水平的内容,所以我碰壁了。非常感谢任何人可以提供的任何见解!
我解决了这个问题,所以我在这里为遇到同样问题的人写下答案。这是基于对这些网络如何工作的误解,但这是我读过的大多数教程中假定的知识,因此其他初学者可能不清楚。
LSTM 网络对这些情况很有用,因为它们可以考虑输入历史记录。将历史赋予 LSTM 的方式是通过排序,但每个序列仍然导致单个输出数据点。所以输入必须是 3D 形状,而输出只是 2D。
给定整个序列和所需的 historyLength,我将输入拆分为 historyLength 序列和单个输出向量。这解决了我的形状问题。
我正在尝试创建一个 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 的序列(任意,但我在某处读到,对这样的序列进行训练是执行此操作的好方法)。
这似乎没问题,但我收到错误值错误:无法为 Tensor u'TargetsData/Y:0' 提供形状值 (128, 16, 4),其形状为 '(?, 4 )'
SO:到目前为止,我的假设是输入形状 [None, seqLength, 4] 对 TF [batchLength(由 tflearn 按顺序提供)、序列长度、样本的特征长度]说.我不明白的是为什么它说输出的形状错误?我是否错误地假设了数据序列拆分?当我只是尝试在不拆分成序列的情况下输入所有数据时,因此输入形状为 [None, 4],TF 告诉我 LSTM 层期望输入形状至少具有 3 个维度。
我不知道输入和输出的形状应该是什么。感觉这应该是一件简单的事情——我有一组输入向量序列,我希望网络尝试预测序列中的下一个。网上几乎没有不具备相当高级知识水平的内容,所以我碰壁了。非常感谢任何人可以提供的任何见解!
我解决了这个问题,所以我在这里为遇到同样问题的人写下答案。这是基于对这些网络如何工作的误解,但这是我读过的大多数教程中假定的知识,因此其他初学者可能不清楚。
LSTM 网络对这些情况很有用,因为它们可以考虑输入历史记录。将历史赋予 LSTM 的方式是通过排序,但每个序列仍然导致单个输出数据点。所以输入必须是 3D 形状,而输出只是 2D。
给定整个序列和所需的 historyLength,我将输入拆分为 historyLength 序列和单个输出向量。这解决了我的形状问题。