データセットは、LSTMの訓練のためにメモリに収まりません

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)

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=26410&siteId=1
おすすめ