R Nanthak:
私は大の音楽データセットでトレーニングされたモデルを作成しようとしています。MIDIファイルはnumpyの配列に変換されます。LSTMがシーケンシャルデータを必要とするので、データセットのサイズがLSTMのシーケンスに変換する上でそれほど大きななります。
私は基調講演と持続時間に基づいてインデックスにMIDIノートを変換するので、私はC4キーの6クラスを取得します。同様に、私は休憩時間のためのクラスと一緒にB5にそう完全に288クラスがC3を取得します。
このような単一のMIDIルックスのフォーマット変換。
midi = [0,23,54,180,23,45,34,.....];
LSTMを訓練するために、xとyはなり
x = [[0,23,54..45],[23,54,..,34],...];
y=[[34],[76],...]
xの値とyはさらにワンホットエンコーディングに変換されます。したがって、データのサイズがちょうど60の小さな半ばのファイルのために膨大になるが、私は1700個のファイルを持っています。どのように私は、ファイルのこの量でモデルを訓練することができます。私はImageGeneratorをチェックするが、それは別のクラスディレクトリにあるようにデータを要求します。これを達成するには?
R Nanthak:
私は、次のコードを使用し、この問題のために発電機のクラスを使用していました。発電機は私の目的のために変更されます。メモリ使用量が大幅に削減されます。
class Generator(Sequence):
def __init__(self, x_set, y_set, batch_size=4):
self.x, self.y = x_set, y_set
self.batch_size = batch_size
self.indices = np.arange(len(self.x))
def __len__(self):
return int(np.ceil(len(self.x) / self.batch_size))
def __getitem__(self, idx):
inds = self.indices[idx * self.batch_size:(idx + 1) * self.batch_size]
batch_x = []
batch_y = []
for ind in inds:
ip = []
for q in self.x[ind]:
o = np.zeros(323)
o[int(q)] = 1
ip.append(o)
batch_x.append(ip)
hot_encoded = []
for val in self.y[ind]:
t = np.zeros(323)
t[int(val)] = 1
hot_encoded.append(t)
batch_y.append(hot_encoded)
return np.array(batch_x), np.array(batch_y)
def on_epoch_end(self):
# np.random.shuffle(self.indices)
np.random.shuffle(self.indices)