このプロジェクトでは、音楽生成用のリカレント ニューラル ネットワーク (RNN) を構築します。モデルは、ABC 記譜法で生の楽譜のパターンを学習するようにトレーニングされ、音楽を生成します。データセットはkaggleから収集されており、曲のABC表記が含まれています。リンク: https://www.kaggle.com/datasets/raj5287/abc-notation-of-tunes?datasetId=156963&sortBy=dateRun&tab=profile データセット内のテキストは、ルックアップ テーブルを維持するための数値表現を作成するために最初にベクトル化されます。明確なシーケンス長で RNN をトレーニングするために、いくつかのサンプルシーケンスを使用します。次の文字を予測するためのターゲット シーケンスもあります。これは、この文字インデックスのストリームを必要なサイズのシーケンスに変換するバッチ メソッドを使用して実装されます。私たちが作成する RNN モデルは LSTM アーキテクチャに基づいており、初期化子「glorot_uniform」とアクティベーション関数「sigmoid」を持ち、状態ベクトルを使用して連続する文字間の時間的関係に関する情報を維持します。 LSTM の最終出力は完全に接続された Dense 層に供給され、そこで語彙内の各文字のソフトマックスが出力され、この分布からサンプリングして次の文字を予測します。
レイヤー 1: インデックスを固定埋め込みサイズの密なベクトルに変換する埋め込みレイヤー
レイヤ 2: ユニット数 rnn_units の LSTM。
レイヤー 3: LSTM 出力を語彙サイズに変換する高密度 (完全に接続された) レイヤー。
RNN モデルは、カテゴリカル分類タスクの整数ターゲットを利用するため、クロスエントロピー損失 (負の対数尤度損失)、つまり sparse_categorical_crossentropy loss の形式を使用してトレーニングされます。真のターゲット (ラベル) と予測されたターゲット (ロジット) を使用して損失を計算したいと考えています。ハイパーパラメータは設定と最適化のために定義されています。トレーニング演算用のオプティマイザーとしてAdam optimizerを使用します。モデルは、バッチ サイズ 10、シーケンス長 100 で 3000 回の反復でトレーニングされます。学習率を 1e-3 に設定すると、モデルの学習が向上します。音楽を生成するために、モデルは次の予測手順に従います。
ステップ 1: 「シード」開始文字列と RNN 状態を初期化し、生成する文字数を設定します。
ステップ 2: 開始文字列と RNN 状態を使用して、次の予測文字の確率分布を取得します。
ステップ 3: 多項分布からサンプリングして、予測された文字のインデックスを計算します。この予測された文字は、モデルへの次の入力として使用されます。
ステップ 4: 各タイム ステップで、更新された RNN 状態がモデルにフィードバックされるため、次の予測を行う際により多くのコンテキストが得られます。次の文字を予測した後、更新された RNN 状態が再びモデルにフィードバックされます。これにより、前の予測からより多くの情報を取得しながら、データ内のシーケンス依存関係が学習されます。
ここで、モデルはユーザー定義の「start_string」と「generation_length」を使用して曲を生成します。