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は人間の命令を聞かず不気味な笑い声を上げる

人類が人工知能の開発に熱心に取り組み始めて以来、著名な科学者ホーキング博士をはじめ、疑問や反対の声が...

GenAIは将来のインシデント管理プロセスを形作っています

回答者の大多数 (59.4%) は明確なインシデント管理プロセスを導入しており、自動化のレベルはニー...

2030 年の AI はどのようになっているでしょうか?専門家が10の予測を発表

2020 年も終わりに近づいていますが、AI はさまざまなことに役立っています。車を運転したり、音楽...

人工知能とインテリジェント人工知能、AIの開発はデータサポートから切り離せない

AIは半世紀以上もの間、低調でしたが、囲碁の人工知能プログラム、AI茶室、AI+医療、AI+交通など...

メタ副社長:生成AIはまだ愚かなので、リスクを心配する必要はありません

メタの副社長兼国際問題担当会長で元英国副首相のニック・クレッグ氏は、BBCとの最近のインタビューで、...

2021 年の機械学習の 6 つのトレンド

機械学習は今日ではよく知られた革新的な技術となっています。ある調査によると、現在人々が使用しているデ...

...

LRU キャッシュ アルゴリズムの Java カスタム実装

背景LinkedHashMap は HashMap を継承し、内部的に removeEldestEn...

AIとIoTを活用したスマートサプライチェーン

デジタル時代では、サプライチェーンのインテリジェンスのレベルが企業の生産効率とパーソナライズされたサ...

資金調達、新製品、アプリケーションは引き続き成長中:8月のドローン業界の最新動向の概要

[[420938]]現在、人工知能や5Gなどの技術の助けを借りて、我が国のドローン開発は急速な成長の...

12 のシナリオ アプリケーション、100 を超えるアルゴリズム、AI はどのようにして経済を征服するのか?

[[328065]] 2020年2月7日、第34回アメリカ人工知能学会年次会議(AAAI 2020...

国際翻訳コンテストで優勝したモデルがByteDanceによってオープンソース化された。

Transformer などの主流のテキスト生成アルゴリズムの単語単位の生成は、並列計算に適した ...

UiPath: 自動化とは、退化を拒否し、価値の高い仕事の創出に専念することです

【51CTO.comオリジナル記事】近年、RPAの開発はかつてないほど注目を集めています。 Mark...

交通渋滞の解決、放射線の監視、現場での捜索救助...ドローンにはどんな素晴らしい用途があるのでしょうか?

01 トラフィック監視セキュリティ任務におけるドローンの有望な用途の 1 つは、交通監視システムの...

プログラマーの面接でよく聞かれる質問: スケジュールされたタスク スケジューラを設計し、どのようなアルゴリズムとデータ構造を使用するか

学生時代、私は Huya の面接を受けたことがあります。今でもはっきりと覚えている面接の質問がありま...