記事一覧

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Magentaを使ってAI(人工知能)に作曲をさせてみる


Google Brainチームが発表したMagentaを使ってAIに作曲をさせてみます。作曲させる曲のジャンルはクラシックで、演奏させる楽器はピアノとします。

作曲された曲はこちら



Magentaとは

MagentaとはGoogle Brainチームによって開発されている、RNN(Recurrent Neural Networks)を利用して音楽や芸術作品を創りだそうと発表されたプロジェクトです。

Magentaは2つの目標を掲げています。
1つ目は音楽と芸術のためのマシンインテリジェンスの最先端技術を進歩させること。
機械学習は音声認識や言語翻訳など既に広く使用されています。Magentaでは、芸術と音楽の生成方法を学ぶことができる他の開発アルゴリズムを探求し、自ら魅力的で芸術的なコンテンツを作成する可能性があるとしています。

二つ目はアーティストやコーダー、機械学習の研究者のコミュニティを構築していくこと。
Google Brainのチームメンバーだけでなくそのコミュニティの貢献者からの意見を取り入れたいと考えています。さらにはアーティストがMagentaのモデルと一緒に音楽を演奏することを非常に簡単にしたいと考えています。



Basic RNN

Magentaには"Basic RNN" "Lookback RNN" "Attention RNN"の3つのRNNが用意されています。
今回は導入モデルである"Basic RNN"を使用します。
「Basic RNN」は、LSTMモデルによるメロディ生成のベースラインとして機能します。LSTMへの入力として抽出されたメロディーを表現するために、入出力にOne-hot Vectorを使用しています。モデルへの入力は、以前のイベントのみのOne-hot Vectorであり、ラベルはターゲットの次のイベントです。

Basic RNNで利用可能なOne-hot Vectorのイベントは
1. note-on(noteを再生する。)
2. note-off(現在再生のnoteをオフにする。)
3. no event(noteが再生されている場合はそれを維持し、noteが再生されていない場合は無音を続ける。)
の3つです。

早速「Basic RNN」を使って作曲をさせてみます。


開発環境

OS:Ubuntu14.04
GPU:Geforce GTX1080 SLI (2way)
その他:Tensorflow 0.12.1, CUDA8.0, cuDNN5.1など



環境構築

1. Magentaのレポジトリをクローン。

2. ここからMagentaのpipパッケージをダウンロード。

3. ダウンロードしてきたパッケージをpipでインストール。


2017年2月24日現在、最新のパッケージが「magenta-0.1.9・・・」となっていますが、今後のアップデートで変わるかもしれません。

これでPythonでmagentaが使えるようになりました。
magentaの中でtensorflowもインポートされているみたいですね。
TensorflowでCUDAを利用しているため、「I tensorflow ・・・ successfully opened CUDA library ・・・」の表示がありますが、TensorflowをCPUのみで利用している場合はこの表示はありません。


教師データ用のMIDIデータの収集

今回はクラシック曲のMIDIデータをこちらから合計161のMIDIファイルをダウンロードさせて頂きました。
どうやらMagentaから出力されるMIDIファイルはピアノのみになるようなのでピアノ曲のみをチョイスしました。

保存ディレクトリは
としました。



NoteSequenceの作成

ここではMIDIファイルをNoteSequenceに変換します。Sequenceはプロトコルバッファで高速かつ効率的なデータフォーマットであり、MIDIファイルも扱いが容易です。
さらにこのNoteSequenceをTensorflowで扱えるように、TFRecordファイルとして作成します。
$INPUT_DIRECTORY・・・・・MIDIファイルの保存してあるディレクトリ
$SEQUENCES_TFRECORD・・・・・TFRecordの出力先

これでNoteSequenceのTFRecordが作成できました。



SequenceExamplesの作成

作成したNoteSequencesからメロディを抽出し、そのメロディを表す一連の入力と一連のラベルをSequenceExamplesとして保存します。今回は"Basic RNN"で作曲をするので、ここで言う一連の入力と一連のラベルとは、先ほど記載した下記の3項目になります。

1. note-on(noteを再生する。)
2. note-off(現在再生のnoteをオフにする。)
3. no event(noteが再生されている場合はそれを維持し、noteが再生されていない場合は無音を続ける。)

作曲をするRNNは"--config"で指定します。

そしてSequenceExamplesは訓練データと評価データの2つのデータが生成され、それぞれトレーニング時と評価時にモデルに入力されます。
--config・・・・・学習に使うRNNを指定します。今回は"BasicRNN"を使用するので"basic_rnn"を指定します。
--eval_ratio・・・・・訓練データと評価データの割合を決めます。0.10ならばNoteSequencesから抽出されたメロディの10%が評価データとして保存され、90%が訓練データとして保存されます

ここまでで教師データの作成が終了し、学習の準備が整いました。


※注意
下記のようなエラーが出る場合があります。
どうやらバージョンアップによってTensorFlowの仕様が変わってしまったようです。

エラーが出た"events_rnn_graph.py"の24行目を下記のように修正します。
これで"BasicLSTMCell"を使用できるようになります。

参考: im2txt: AttributeError: 'module' object has no attribute 'BasicLSTMCell' and other problems #887



モデルをトレーニングする

いよいよモデルをトレーニングさせます。
以下のコマンドを実行してトレーニングジョブを開始します。
--config・・・・・トレーニングに使うRNNを指定します。今回は"BasicRNN"を使用するので"basic_rnn"を指定します。
--run_dir・・・・・トレーニングされたモデルとTensorBoardデータが格納されるディレクトリ。モデルとTensorBoardデータは任意のイテレーション数(チェックポイント)時に出力されます。
--sequence_example_file・・・・・モデルに供給されるSequenceExamplesのTFRecordファイル
--num_training_steps・・・・・学習ループを終了する前に取るべき更新ステップ。未設定の場合はトレーニングループは手動で終了されるまで実行され続けます。
--hparams・・・・・デフォルト以外のハイパーパラメータを指定するために使用できます。今回はデフォルトのバッチサイズ128の代わりに64のカスタムバッチサイズを指定します。バッチサイズを小さくするとメモリ使用量を減らすことができ、大きなモデルをトレーニングする際のメモリ不足の問題を解決できます。レイヤーサイズも今回は2層の128ユニットの代わりに、それぞれ64ユニットの2層RNNを使用します。ユニット数を減らすことにより、モデルの学習を速くすることができます。しかし、大きなコンピューティングパワーを持っている場合は、大きなレイヤーサイズを使用してより良い結果を試すことができます。

下記のように学習が進んでいきます。
Perplexity・・・・・ある音に対して、次に続く可能性のある音の選択肢の数(バリエーション)を表しています。


※注意
"SequenceExamplesの作成"と同じような下記の2つのエラーが出る場合があります。
やはりこれもバージョンアップによってTensorFlowの仕様が変わってしまった影響のようです。

これも先ほどのSequenceExamples作成時と同じように、エラーが出た"events_rnn_graph.py"の45行目と49行目を下記のように修正します。
これで"DropoutWrapper"と"MultiRnnCell"を利用できるようになります。



データフローと学習過程の可視化

下記のコマンドを実行して学習中に出力されたTensorBordデータからデータフロート学習過程を可視化してみます。

Screenshot from 2017-02-27 02:24:19

Screenshot from 2017-02-27 02:24:32

 Screenshot from 2017-02-27 02:05:30    Screenshot from 2017-02-27 02:05:42

グラフを見てみると学習が進むにつれて損失が減り、精度が上がっていることがわかります。



モデルに音楽を作曲させる

学習したモデルでメロディを作曲します。
メロディは学習中でも学習後でも生成することができます。
以下のコマンドを実行して、最新のチェックポイントで出力されたトレーニング済みのモデルを使用して一連のメロディーを生成します。
--config・・・・・作曲に使用するRNNを指定します。今回は"basic_rnn"を指定します。
--run_dir・・・・・トレーニングジョブに使用されているものと同じディレクトリでなければなりません。--run_dir内の訓練サブディレクトリは、最新のチェックポイントファイルがロードされる場所です。例えば、"--run_dir=/tmp/melody_rnn/logdir/run1"とすると、最新のチェックポイントファイル"/tmp/melody_rnn/logdir/run1/train"が使用されます。
--hparams・・・・・トレーニングジョブに使用されているものと同じハイパーパラメータでなければなりませんが、バッチサイズのように一部が無視されます。
--output_dir・・・・・生成されたMIDIファイルが保存される場所です。
--num_sptes・・・・・メロディの長さです。今回は256を指定しました。(128steps=8bars)
--primer_melody・・・・・音楽の作曲を開始する前に少なくとも1つの音符をモデルに供給する必要があります。"--primer_melody"を使用して、Pythonリストの文字列表現を使ってプライミングメロディを指定することができます。リスト内の値は、melodies_lib.Melody形式(-2=イベント無し、-1=ノートオフイベント、0~128=そのMIDIピッチのノートオンイベント)に続く整数でなければなりません。例えば、"--primer_melody="[60,-2,60,-2,67,-2,67,-2]"は、"Twinkle Twinkle Little Star"の最初の4つのノートでモデルをプライムします。"--primer_melody"を使用する代わりに、"--primer_midi"を使用してMIDIファイルに格納されたメロディーでモデルをプライムすることができます。例えば、"--primer_midi=は、モデルにそのMIDIファイルのメロディをプライムします。"--primer_melody"と"primer_midi"のどちらも指定されていない場合は、モデルの音域からのランダムな音符が最初の音符として選択され、残りの音符はモデルによって生成されます。今回は"--primer_melody="[70]"で試してみます。


生成された音楽がこちら。(10個のMIDIファイルを生成しましたが、その中の5個をご紹介します。)

Magenta1



Magenta2



Magenta3



Magenta4



Magenta5



なんとなくクラシックっぽく、曲になってる?気もします。
不安を誘いそうな曲調とかもあって面白いですね。



おまけ

"--primer_melody="[80]"でも試してみました。

Magenta_80_1



Magenta_80_2



Magenta_80_3



Magenta_80_4



Magenta_80_5



"--primer_melody="[70]"のときよりも全体的に明るく流れるような曲調になりましたね。



最後に

今回はMagentaを使ってAIに音楽を作曲させてみました。
Magentaが一番最初に発表した最も基本的なRNNである"Basic RNN"でここまでの曲が作成できたことに正直驚いています。
今現在(2017/3/4)、Magentaには"Basic RNN"の他に"Lookback RNN" と"Attention RNN"が存在します。この2つは"Basic RNN"よりもグレードアップさせたRNNなのでこの2つを使った場合に生成される曲はどんな曲になるのか、試すのが楽しみです。
そして今回はクラシック曲のみを学習させたので、全体的になんとなくクラシックっぽい曲になりました。もしいろいろなジャンルの曲を学習させたら一体どんな曲が作曲されるのか、こちらも試してみたいですね。


スポンサーサイト

コメント

コメントの投稿

非公開コメント

プロフィール

むらりん

Author:むらりん
学部3年
ピカチュウLOVE

「将来絶対ハゲるよねw」とよく言われます。

累計閲覧者数

最新の人工知能関連のツイート

メールフォーム

名前:
メール:
件名:
本文:

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。