データを Keras にフィードする方法の問題に対する具体的な答えを見つけることができないようです。ほとんどの例は、画像/テキストデータで機能しているようで、データポイントが明確に定義されています。
音楽を LSTM ニューラル ネットワークにフィードしようとしています。ネットワークで 3 秒以内の音楽を再生し、次の 2 秒をノミネートしたいと考えています。私は自分の音楽を .wav ファイルに準備し、X (最初の 3 秒) と Y (最後の 2 秒) に分解した 5 秒間隔に分割しました。私は 44,100 Hz で音楽をサンプリングしたので、X は 132,300 オブザベーションの長さであり、Y は 88,200 オブザベーションの長さです。
しかし、Keras をデータ構造に橋渡しする方法が正確にわかりません。Tensorflow バックエンドを使用しています。
問題と答えを一般化するために、次元を表すのに A、B、C を使用します。このサンプル データと私の実際のデータの唯一の違いは、これらが 0 から 1 までのランダムな値であり、私のデータが整数の配列であることです。
import numpy as np
#using variables to make it easy to generalize the answer
#a = the number of observations I have
a = 411
#b = the duration of the sample, 44.1k observations per second of music
b_train = 132300
b_test = 88200
#c = the number of channels in the music, this is 2 channel stereo
c = 2
#now create sample data with the dimensionality given above:
X = np.random.rand(a,b_train,c)
y = np.random.rand(a,b_test ,c)
#split the data
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.20, random_state=42)
ただし、モデルを構成して、「最初の」(A) 次元に観測が含まれていることと、多かれ少なかれ音楽 (B) をチャネル (C) ごとに分割したいことを理解する方法がよくわかりません。
これをモノ (および 2 次元の問題) に変換する方がおそらく簡単であることはわかっていますが、これに「単純な」解決策があるかどうか、非常に興味があります。または、モデルを別の方法で考えるべきかどうか。
主な質問は次のとおりです。X データを Y データに変換できるモデルをどのように構築すればよいでしょうか?
理想的には、答えは、上記のデータ構造に合わせて以下のモデルを変更する方法を示します。
import keras
import math, time
from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation
from keras.layers.recurrent import LSTM
from keras.models import load_model
def build_model(layers):
d = 0.3
model = Sequential()
model.add(LSTM(256, input_shape=(layers), return_sequences=True))
model.add(Dropout(d))
model.add(LSTM(256, input_shape=(layers), return_sequences=False))
model.add(Dropout(d))
model.add(Dense(32,kernel_initializer="uniform",activation='relu'))
model.add(Dense(1,kernel_initializer="uniform",activation='linear'))
start = time.time()
model.compile(loss='mse',optimizer='adam', metrics=['accuracy'])
print("Compilation Time : ", time.time() - start)
return model
#build model...
model = build_model([328,132300,2])
model.fit(X_train,y_train,batch_size=512,epochs=30,validation_split=0.1,verbose=1)
ただし、これによりエラーが発生します (モデル = ... ステップで):
ValueError: Input 0 is incompatible with layer lstm_2: expected ndim=3, found ndim=4
Keras がどこで ndim=4 のデータを見ることが期待されているのかわかりません。また、モデルが観測値が A 軸に分散され、データ自体が B 軸と C 軸に分散されることを「理解」するように、データをモデルに確実にフィードする方法がわかりません。
何か不明な点がありましたら、コメントを残してください。2017 年 9 月頃までこれを注意深く観察し、残されたアドバイスやコメントを反映するようにこの質問を更新します。
ありがとう!