TensorFlow を使用してロボットに音楽を作曲する方法を教えるにはどうすればよいでしょうか?秘密はこれです

TensorFlow を使用してロボットに音楽を作曲する方法を教えるにはどうすればよいでしょうか?秘密はこれです

今日はAIがどのように音楽を作曲するのかを見ていきたいと思います。

この記事では、TensorFlow を使用して音楽ジェネレーターを作成します。

ロボットに「希望と驚きを語る歌が欲しい」と言ったら、何が起こるでしょうか?

コンピューターはまず音声をテキストに変換し、キーワードを抽出して単語ベクトルに変換します。次に、タグ付けされた音楽データをいくつか使用します。これらのラベルはさまざまな人間の感情を表します。そして、これらのデータに基づいてモデルをトレーニングし、モデルをトレーニングした後、必要なキーワードを満たす音楽を生成できます。プログラムの最終的な出力はいくつかのコードです。所有者が出力に必要とする感情的なキーワードに最も近いコードを選択します。もちろん聴くだけでなく、創作の参考にもなるので、10,000時間の集中練習を達成していなくても簡単に音楽創作ができるようになります。

機械学習は実際には私たちの脳を拡張し、能力を拡張することです。

DeepMind は、音楽生成とテキスト読み上げの技術を紹介した「WaveNet」という論文を発表しました。

一般的に、音声生成モデルは連結されます。つまり、テキスト サンプルから音声を生成する場合、音声の一部を切り取って再構成し、完全な文を形成するために、非常に大規模な音声断片データベースが必要になります。

音楽の生成についても同じことが言えますが、大きな難しさがあります。静的なコンポーネントを組み合わせると、生成されるサウンドは自然で感情的なものになる必要があり、これは非常に困難です。

理想的なアプローチは、音楽を生成するために必要なすべての情報をモデルのパラメータに保存できることです。それがその論文で議論されていることです。

音声信号を取得するために出力結果を信号処理アルゴリズムに渡す必要はなく、音声信号の波形を直接処理します。

彼らが使用したモデルはCNNです。このモデルの各隠れ層では、各拡張係数が相互接続され、指数関数的に増加します。各ステップで生成されたサンプルはネットワークに再入力され、次のステップの生成に使用されます。

このモデルの図を見てみましょう。入力データは別のノードです。大まかな音波なので、後続の操作を容易にするために、まず前処理する必要があります。

次に、それをエンコードして、いくつかのサンプルとチャネルを持つテンソルを生成します。次に、それを CNN ネットワークの最初のレイヤーに入力します。このレイヤーは、処理を容易にするためにチャネルの数を生成します。次に、すべての出力結果を組み合わせて次元を増やします。次に、次元を元のチャネルの数まで増やします。この結果を損失関数に入れて、モデルがどの程度トレーニングされているかを測定します。 ***、この結果はネットワークに再度投入され、次の時点に必要な音波データが生成されます。このプロセスを繰り返すことで、より多くの音声を生成できます。ネットワークは大規模で、GPU クラスターで 90 分かかり、1 秒のオーディオしか生成できませんでした。

次に、より単純なモデルを使用して、TensorFlow でオーディオ ジェネレーターを実装します。

1.パッケージの紹介:

データ サイエンス パッケージ Numpy、データ分析パッケージ Pandas、および tqdm は、トレーニングの進行状況を示す進行状況バーを生成できます。

  1. numpyをnpとしてインポートする
  2.  
  3. pandasをpdとしてインポートする
  4.  
  5. msgpack をインポートする
  6.  
  7. インポートグロブ
  8.  
  9. テンソルフローをtfとしてインポートする
  10.  
  11. tensorflow.python.opsからcontrol_flow_ops をインポートします
  12.  
  13. tqdmからtqdm をインポート
  14.  
  15. midi_manipulationをインポートする

生成モデルとして、ニューラル ネットワーク モデル RBM 制限ボルツマン マシンを使用します。

これは 2 層ネットワークです。最初の層は可視層で、2 番目の層は非表示層です。同じレイヤー内のノード間には接続がなく、異なるレイヤー内のノードは互いに接続されています。各ノードは、受信したデータを次のレイヤーに送信する必要があるかどうかを決定する必要があり、この決定はランダムに行われます。

2. ハイパーパラメータを定義する:

まず、モデルによって生成する必要がある音符の範囲を定義します

  1. lowest_note = midi_manipulation.lowerBound #インデックス ピアノロール最低
  2.  
  3. 最高音 = midi_manipulation.uPPerBound #インデックス ピアノロール最高
  4.  
  5. note_range = 最高音-最低音 #音域

次に、タイムステップ、つまり可視レイヤーと非表示レイヤーのサイズを定義する必要があります。

  1. num_timesteps = 15 #これ作成するタイムステップです 一度 
  2.  
  3. n_visible = 2*note_range*num_timesteps #これサイズです 可視レイヤー
  4.  
  5. n_hiDDen = 50 #これサイズです 隠れ層

トレーニングステップの数、バッチサイズ、学習率。

  1. num_epochs = 200 #実行するトレーニング エポックの数エポックデータセット全体を調べます
  2.  
  3. BAtch_size = 100 #RBM を介して一度送信するトレーニング例
  4.  
  5. lr = tf.constant(0.005, tf.float32) #モデル学習率

3. 変数を定義します。

xはネットワークに送られるデータである

wは重み行列、つまり2つの層間の関係を格納するために使用されます。

さらに、2 つのバイアスが必要です。1 つは隠し層の bh で、もう 1 つは可視層の bv です。

  1. x = tf.placeholder(tf.float32, [None, n_visible], name = "x" ) #データを保持するプレースホルダー変数
  2.  
  3. W = tf.Variable(tf.random_normal([n_visible, n_hidden], 0.01), name = "W" ) #エッジの重みを格納するweightMATrix
  4.  
  5. bh = tf.Variable(tf.zeros([1, n_hidden], tf.float32, name = "bh" )) #隠れ層バイアスベクトル
  6.  
  7. bv = tf.Variable(tf.zeros([1, n_visible], tf.float32, name = "bv" )) #可視レイヤーバイアスベクトル

次に、補助メソッド gibbs_sample を使用して、入力データ x からのサンプルと、隠し層のサンプルを作成します。

gibbs_sample は、複数の確率分布からサンプルを抽出できるアルゴリズムです。

各状態が前の状態に依存する統計モデルを生成し、分布に準拠するサンプルをランダムに生成できます。

  1. #xサンプル
  2.  
  3. x_sample = ギブスサンプル(1)
  4.  
  5. #x可視状態から始まる、隠れノードサンプル
  6.  
  7. h = サンプル(tf.sigmoid(tf.matMUl(x, W) + bh))
  8.  
  9. #x_sample可視状態から始まる、非表示ノードサンプル
  10.  
  11. h_sample = サンプル(tf.sigmoid(tf.matmul(x_sample, W) + bh))

4. 変数を更新します。

  1. サイズ_bt = tf.CA
  2.  
  3. st(tf.shape(x)[0], tf.float32)
  4.  
  5. W_adder = tf.mul(lr/size_bt、tf.sub(tf.matmul(tf.transpose(x)、h)、tf.matmul(tf.transpose(x_sample)、h_sample)))
  6.  
  7. bv_adder = tf.mul(lr/size_bt, tf.reduce_sum(tf.sub(x, x_sample), 0, True ))
  8.  
  9. bh_adder = tf.mul(lr/size_bt, tf.reduce_sum(tf.sub(h, h_sample), 0, True ))
  10.  
  11. # sess.run(updt)を実行する、TensorFlowは3つの更新ステップすべてを実行します
  12.  
  13. 更新 = [W.assign_add(W_adder), bv.assign_add(bv_adder), bh.assign_add(bh_adder)]

5. グラフアルゴリズムグラフを実行します。

1. まず変数を初期化する

  1. tf.Session()を sessとして使用:
  2.  
  3. #まず、モデルをトレーニングします
  4.  
  5. #モデル変数を初期化する
  6.  
  7. 初期化 = tf.initialize_all_variables()
  8.  
  9. セッションの実行(初期化)

まず、対応するベクトル表現をモデルのトレーニングにうまく使用できるように、各曲の形状を変更する必要があります。

  1. tqdm(range(num_epochs))エポックの場合:
  2.  
  3. songGSの場合:
  4.  
  5. #曲は時間×音符形式保存されますサイズは 各曲timesteps_in_song x 2*note_range
  6.  
  7. #ここでは、各トレーニング例がnum_timesteps x 2*note_range要素を持つベクトルなるように曲を再形成します
  8.  
  9. 歌 = np.array(歌)
  10.  
  11. 歌 = 歌[:np.floor(song.shape[0]/num_timesteps)*num_timesteps]
  12.  
  13. 歌 = np.reshape(歌、[歌.shape[0]/num_timesteps、歌.shape[1]*num_timesteps])

2. 次に、RBMモデルを1サンプルずつトレーニングします。

  1. i範囲(1、len(song)、batch_size)場合:
  2.  
  3. tr_x = 曲[i:i+バッチサイズ]
  4.  
  5. sess.run(updt、feed_dict={x: tr_x})

モデルが完全にトレーニングされると、音楽の生成に使用できるようになります。

3. ギブスチェーンをトレーニングする必要がある

表示可能なノードは、いくつかのサンプルを生成するために 0 に初期化されます。

次に、再生に適した形式にベクトルを再形成します。

  1. サンプル = gibbs_sample(1).eval(セッション=sess、フィードディクショナリ={x: np.zeros((10, n_visible))})
  2.  
  3. iが範囲(sample.shape[0])場合:
  4.  
  5. そうでなければ 任意(サンプル[i,:]):
  6.  
  7. 続く 
  8.  
  9. #ここでベクトルを時間×音符変え、  次に、ベクターをMIDIファイルとして保存します。
  10.  
  11. S = np.reshape(サンプル[i,:], (num_timesteps, 2*note_range))

4.***、生成されたコードを印刷する

  1. midi_manipulation.noteStateMatrixToMidi(S, "generated_chord_{}" .format(i)) 1212

要約すると、CNN はパラメータ化された音波を生成するために使用されます。

RBM はトレーニング データに基づいてオーディオ サンプルを簡単に生成できます。

ギブス アルゴリズムは、確率分布に基づいてトレーニング サンプルを取得するのに役立ちます。

***Siraj のオリジナル ビデオとソース コード リンクをお送りします。

<<:  正義がアルゴリズムを採用したとき、最後に笑うのは正義か、それともテクノロジーか?

>>:  機械学習初心者からマスターまで

推薦する

...

バックプロパゲーションを用いた多層ニューラルネットワークのトレーニングの原理

記事「バックプロパゲーションを使用した多層ニューラル ネットワークのトレーニングの原理」では、バック...

レゴブロックを積み上げるように: ニューラルネットワークの数学をゼロから説明する

ニューラル ネットワークは、線形モジュールと非線形モジュールを巧みに組み合わせたものです。これらのモ...

AIの力を借りれば、罠だらけのジムは歴史の舞台から消えるのでしょうか?

[[336650]]驚くべきことに、COVID-19の世界的大流行の中で、フィットネスやエクササイ...

ストーリーを伝えれば、動画が編集されます。AI による動画編集の自動化により、パンダの目を持つ編集者が解放されます。

ビデオ編集は、編集者が適切なフレームを見つけてつなぎ合わせる必要がある、時間と労力を要する作業です。...

Google Bard「叙事詩」アップデート:カスタマイズされた中国語サービス、画像分析機能を公開

今年3月、Googleは生成AI「Bard」のベータ版のリリースを発表しました。当時、このバージョン...

NVIDIA GPU が一戦で神となる!黄仁訓は人工知能に賭け、1兆ドル規模のグラフィックカード帝国を築く

AlexNet ニューラル ネットワークから ChatGPT、生成 AI の爆発的な増加まで、NVI...

快手科技のY-tech AI Labが「2019 CCF科学技術賞」を受賞

より多くの中級・低級モデルでハイコンピューティングAIタスクを普及させるために、快手が自社開発した「...

ディープラーニングを使って夢に現れる物体を分析する(完全版)

[[197493]]この記事の主な内容は機械学習と神経科学を組み合わせたものであり、読者にはこれら...

...

...

Mac専用の大型モデルフレームワークが登場! 2行のコードでデプロイでき、ローカルデータとチャットでき、中国語もサポートしています

Mac ユーザーは、ついに、RTX を使用した独自の大型モデル チャットを持つ N カード プレーヤ...

...

...

...