2

LSTMレイヤを持つNNのデータを作成する方法に問題があります。私は多くのファイルが何百もの行を含んでいます。 各ファイルは曲を表します各行は4つの値のノートを表します。 NNがノートをと読んで、10音符の系列のシーケンスを読んで、それらから次の音符を予測できるようにします。必要な場合は、1曲あたり5000音符の音符数に修正することができます。LSTM NNの入出力データはどのような形状にする必要がありますか?

は、入力データと出力データに必要なものと、最初のLSTMレイヤの定義方法を知りたいだけです。

model = Sequential() 
model.add(LSTM(32, input_shape=(5000, 4),return_sequences=True)) 

まで溜めに:

  • 1つのファイルは5000行4列を持っており、1曲を表します。

  • ファイル内の1行は、4つの値を持つ1つの音符を表します。

ありがとうございました。

+0

あなたは、入力データのサンプルを提供していただけますか? – grovina

+0

入力データには何千もの行があるので、ここでは入力できません.4つの列があり、それぞれの値は0と1の間の数値です。 – Juan

答えて

1

最初のLSTM層の入力形状は、(None, 10, 4)である必要があります。 モデルの出力形状は(None, 4)です。バッチサイズはNoneです。

私は、一例として、単純なLSTMをコード化:

import numpy as np 
from keras.layers import LSTM 
from keras.models import Sequential 

batch_size = 32 
window_length = 10 
note_dim = 4 
n_samples = 5000 

# Input data. TODO: Slide window and modify it to use real data 
x = np.ones(shape=(n_samples, window_length, note_dim)) 
y = np.ones(shape=(n_samples, note_dim)) 

# Define model 
model = Sequential() 
model.add(LSTM(note_dim, input_shape=(window_length, note_dim))) # The batch dimension is implicit here 

model.compile('sgd', 'mse') 
model.fit(x=x, # Batch input shape is: (None, window_length, note_dim) 
      y=y, # Batch output shape is: (None, note_dim) 
      batch_size=batch_size) 

を使用すると、より複雑なモデル(すなわち2つのLSTM層を)したい場合、あなたはこのようにそれを定義することができます。

# ... 
# Define model 
hidden_size = 50 
model = Sequential() 
model.add(LSTM(hidden_size, input_shape=(window_length, note_dim), return_sequences=True)) # The batch dimension is implicit here 
model.add(LSTM(note_dim)) 
# ... 

更新:あなたの最初のコメントに応答します。

xには、ウィンドウをスライドさせた後にすべての曲を含める必要があります。たとえば、すべての曲が含まれているsongsという形の変数(n_songs, notes_per_song, note_dim)があるとします。すると、次のようにxyを作成することができます。

# ... 
# Input data  
# Suppose that variable ´songs´ is an array with shape: (n_songs, notes_per_song, note_dim). 
samples_per_song = notes_per_song-window_length 
n_samples = n_songs*samples_per_song 
x = np.zeros(shape=(n_samples, window_length, note_dim)) 
y = np.zeros(shape=(n_samples, note_dim)) 
for n, song in enumerate(songs): 
    for i in range(samples_per_song): 
     x[i+n*samples_per_song, :, :] = song[i:(i+window_length), :] 
     y[i+n*samples_per_song, :, :] = song[i+window_length, :] # note that you want to predict 
# ... 
+0

ありがとうございます。だから私がよく分かっていれば、すべての曲が同じファイルにあるはずですか?ファイルにはNB_songs * 5000行がありますか?または、xが1つの曲を表していて、それを入力として使用していて、NNがそれを処理すると、別の曲でxを置き換えますか?出力データに何を追加すればよいですか?私はどのように出力を構築するのですか? – Juan

+0

あなたの曲がディスクにどのように格納されているかはあまり関係ありません(複数の方法でそれらを保存して読み込むことができます)。私は入力データ 'x'と出力' y'の両方をどのように構築するかを説明するために答えを更新しました。私が追加したコードはテストしていませんが、そのコードからアイデアを得ることを願っています。 – rvinas

+0

あなたの更新された回答に感謝します!だから、もし私が2曲を持っていて、両方とも5000の音を持っているなら、配列の "曲"はそのときの形(2,5000,4)を持っていますか?そしてあなたによれば、新しい配列xとyの形状はどうなるでしょうか? (私はあなたの変数samples_per_song、n_samplesなどの値を取得しません...)。この新しい配列xは、NNの入力データになります。 – Juan

0

NNが10音符のシーケンスで音符を読んで、次の音符を予測できるようにします。

私はケラを一度も使用していませんが、私はあなたが最初にそれらの音符をidsに変換するべきだと思います。たとえば、(aa、bb、cc、dd)は1、(ab、bb、cc、dd)は2などとなります。

次に、エンコーダの10桁/最終的な状態は11番目の音符になります。そして、あなたがその曲の中のどの音符からも10音符でモデルをテストしたいなら、2番目から11番目までを訓練し、投影後に12番目をターゲットにします。そして、最後の音符が目標になるまで続く。これは1つの曲のためであり、すべての曲でこれを繰り返します。

idsを使用してノートを返すことができます。それを前後に移すためのボキャブラリを構築することができます。

+0

ありがとうございました。私はそれをやろうとします。 1つの曲のノートを含む配列xを想像してみてください。私はそれを入力データとして使用します。しかし、出力データをどのように構築すればよいですか?最初の10のノートがなければxと同じでなければなりませんか? – Juan

+0

それはあなたの仕事を傷つけます。あなたの質問では、あなたは前の10のノートを与えられた次の1つの音符を生成することを意味し、私は私の答えの方法を提案する。あなたはあなたの質問を詳述できますか? – lerner

+0

はい、NNが10のノートから1つのノートを予測したいと思います。しかし、機械学習を行う前に、入力と出力の配列を定義する必要があります。私は今何を入力するべきかを知っていますが、出力をどのように埋めるべきですか?最初のステップでは、NNは最初の10個のノートを取り、11番目のものを予測し、出力の最初の行にある実際の11番目のノートと比較します。しかし、出力の次の部分はどうですか? – Juan

関連する問題