2

音楽のシーケンスを生成する lstm-rnn を作成しようとしています。トレーニング データは、サイズ 4 のベクトルのシーケンスであり、トレーニングするいくつかの曲の各ノートのさまざまな機能 (MIDI ノートを含む) を表します。

私の読書から、私がやろうとしているのは、各入力サンプルに対して持っているように見えます.出力サンプルは次のサイズ4のベクトルです(つまり、現在のものから次の音符を予測しようとする必要があります.以前のサンプルの知識を組み込んだ LSTM)。

私はまだRNNに慣れていないので、tflearnを使用しています。次のコードがあります

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', which has shape '(?, 4)' が表示されます

SO: これまでの私の仮定では、入力形状 [None, seqLength, 4] が TF [batchLength (tflearn によって順次供給される)、シーケンスの長さ、サンプルの特徴の長さ] に言っているということです。私が理解していないのは、出力が間違った形状であると言っている理由ですか? データ シーケンスの分割について間違っていると思いますか? シーケンスに分割せずにすべてのデータを入力しようとすると、入力形状が [None, 4] になり、TF は、LSTM レイヤーが少なくとも 3 次元の入力形状を期待していることを通知します。

入力と出力の形状がどうあるべきか、頭を丸くすることはできません。これは単純なことのように感じます.ベクトルの入力シーケンスのセットがあり、ネットワークにシーケンスの次のシーケンスを予測させたいと思っています. かなり高度なレベルの知識を想定していないオンラインはほとんどないので、私はレンガの壁にぶつかりました. 誰かが与えることができる洞察に本当に感謝します!

4

1 に答える 1

3

私はこれを解決したので、同じ問題を抱えている人のためにここに答えを書いています。これらのネットワークがどのように機能するかについての誤解に基づいていましたが、これは私が読んだほとんどのチュートリアルで想定されている知識であるため、他の初心者には明確ではない可能性があります.

LSTM ネットワークは、入力履歴を考慮に入れることができるため、このような状況に役立ちます。履歴が LSTM に与えられる方法はシーケンスによって行われますが、各シーケンスは依然として 1 つの出力データ ポイントにつながります。したがって、入力は 3D 形状である必要がありますが、出力は単なる 2D です。

シーケンス全体と目的の historyLength を指定すると、入力を historyLength のシーケンスと単一の出力ベクトルに分割します。これにより、形状の問題が解決されました。

于 2016-04-11T11:14:29.957 に答える