Music Transformerを動かしてみる
シグナル・コンポーズの大和です。
研究活動の一環で、機械学習/Deep Learningの音楽生成の仕組みを試しているところなのですが、MIDIベースでの今のところ一番性能が良さそうなMusic Transformerという仕組みがあります。
で、今回はそれをとりあえずMacBook Proで動かしてみたいと思います。あまりメンテナンスされてないコードみたいでちょっと難ありだなーという感じですが、同じくシグナル・コンポーズのleicoにも手伝ってもらって「とりあえずは動いたかな、、、」というところまでは行ったのでそれの記録です。
Music Transformer tensorflow 2.0 のダウンロード、必要モジュールのインストール
基本的にはこちらに書いてある通りのことを上からやっていきます。
https://github.com/jason9693/MusicTransformer-tensorflow2.0
$ git clone https://github.com/jason9693/MusicTransformer-tensorflow2.0.git
$ cd MusicTransformer-tensorflow2.0
$ git clone https://github.com/jason9693/midi-neural-processor.git
$ mv midi-neural-processor midi_processor
International e-piano competition のデータダウンロード
github リポジトリ内に Midi/ecomp というディレクトリを作ってそこにダウンロードしました。
$ mkdir Midi
$ mkdir Midi/ecomp
$ sh dataset/script/ecomp_piano_downloader.sh
pyenv の環境構築
python 3.7.7 をインストール、ローカルで利用できるようにします。がこの辺りはそれぞれやり方あると思うんで、最終的にTensorflow2.0(最新は2.1)が使えるようにすれば良いです。僕はこのあたりはcondaはpyenvとcondaでやってしまうと思います。
参考リンク:
https://leico.github.io/TechnicalNote/Mac/homebrew-pyenv
pyenv で動作する Python のバージョン管理
・Python 3.7.7 をインストールする
$ pyenv install 3.7.7
・ローカルで利用するバージョンを 3.7.7 に設定
$ pyenv local 3.7.7
・Pythonのパッケージを動作させる仮想環境を構築する
参考リンク: https://leico.github.io/TechnicalNote/Python/homebrew-pyenv-venv-tf-keras
・MusicTransformer という仮想環境を作成する
$ python3 -m venv MusicTransformer
・MusicTransformer 仮想環境を有効化する
$ source MusicTransformer/bin/activate
・MusicTransformer 仮想環境に TensorFlow 2.0.1 をインストールする
最新のTensorflowのバージョンは2.1なのですが下記のようにあるので2.0系を入れます。
1. This Repository is perfectly compatible with tensorflow 2.0
---
https://github.com/jason9693/MusicTransformer-tensorflow2.0
・pip で入れれるバージョンの一覧を取得する
https://www.monotalk.xyz/blog/pip-インストールする-ライブラリの-version-番号を調べる/
・pip で TensorFlow 2.0.1 をインストールする
$ pip install tensorflow==2.0.1
・$ python preprocess.py {midi_load_dir} {dataset_save_dir} がエラーになる
$ python preprocess.py Midi/ecomp/ Midi/ecomp_dataset
Traceback (most recent call last):
File "preprocess.py", line 6, in <module>
from progress.bar import Bar
ModuleNotFoundError: No module named 'progress'
ので、必要なモジュールをインストールします。
$ pip install progress
$ pip install pretty_midi
$ pip install config
ここまでが必要なモジュール。
ソースコードを修正する
今のソースでは動かないのでソースの修正をします。
https://github.com/jason9693/MusicTransformer-tensorflow2.0/pull/17/files
・preprocess.py の17行目を修正
# return encode_midi(path, augumentation=False)
return encode_midi(path)
・preprocess.py を動作させる
Midiデータのフォルダは Midi/ecomp データセットの出力フォルダはMidi/ecomp_dataset にしました。
$ python preprocess.py Midi/ecomp/ Midi/ecomp_dataset
train.py を使ってダウンロードしたMIDIデータを使って学習するために必要なモジュールをインストールする
$ python train.py --epochs=100 --save_path=Midi/ecomp_model --pickle_dir=Midi/ecomp_dataset
・で動作させたら tensorflow-probability が無いと言われたのでインストールする。
tensorflow-probability の最新版( 0.9 )を入れたら tensorflow 2.1 が必要と言われたので tensorflow 2.0 ※で動作させるために tensorflow-probability は 0.8 をインストールします(※ Music Transformer の推奨バージョンは tensorflow 2.0)
$ pip install tensorflow_probability==0.8
train.py を修正する。
そのままでは現状動かない。44行目を修正する
# load data
#dataset = Data('dataset/processed')
dataset = Data(pickle_dir)
pickle_dir の引数が全く機能していなかった。
・train.py の引数を追加する
macbook Pro 2016 のGPUは cuda 対応していないので GPU を false にします。
$ python train.py --epochs=100 --save_path=Midi/ecomp_model --pickle_dir=Midi/ecomp_dataset --multi_gpu=False
これでとりあえず動いた。これをそのままやるといつまでも学習が終わらないので、実際に学習が行われてモデルが作られるかを確認するために以下のようにして動かしてみた。
$ python train.py --epochs=1 --batch_size=5 --save_path=Midi/ecomp_model --pickle_dir=Midi/ecomp_dataset --multi_gpu=False
で、結果としては以下のようになりました。
...
====================================================
Epoch/Batch: 0/0
Train >>>> Loss: 6.38114, Accuracy: 0.0016601562965661287
Eval >>>> Loss: 6.38903, Accuracy: 0.0011718750465661287
...
====================================================
Epoch/Batch: 0/100
Train >>>> Loss: 5.52144, Accuracy: 0.03528263047337532
Eval >>>> Loss: 5.44073, Accuracy: 0.03563410043716431
====================================================
...
Epoch/Batch: 0/200
Train >>>> Loss: 5.06596, Accuracy: 0.04672827571630478
Eval >>>> Loss: 4.99958, Accuracy: 0.046788834035396576
一応ロスが減少していっており、正確性も上がっているようです。とはいえこの状態ではかなり学習としては足らないのでGoogle ColabやGPUを積んだ火力の強いUbuntuとかのマシンが欲しいですね、、、。
generate.py が動かないので動くように改造する
コードがメンテナンスされてないみたいなので仕方ないっちゃ無いけど、機械学習系のコードはこういうの多いですね、、、。ドキュメントもあまりちゃんとしてないし、コードが風化するのが早い、、、。
で、デフォルトだと dataset/midi/BENABD10.mid を generate の種、RNNで生成する時最初に必要な情報として読み込むことにしていのでこれを --prior_midi=path/to/midi という形に改良する。21行目に以下を追加します。
parser.add_argument('--prior_midi', default='dataset/midi/BENABD10.mid', type=str, help='prior data for generate midi file')
そして、34行目に以下を追加
prior_midi = args.prior_midi
次に、56行目を変更
#inputs = encode_midi('dataset/midi/BENABD10.mid')
inputs = encode_midi(prior_midi)
generate.py を動作させる
コマンドはこれ。
$ python generate.py --load_path=Midi/ecomp_model --prior_midi=Midi/ecomp/BENABD10.mid --length=1000
ただし、lengthをデフォルト(2048)で実行するとエラーになります。1000程度なら大丈夫なので、とりあえずはこれをもとに少しいろいろな組み合わせで学習させてみようかと思います。
で。生成できたのがこれ。
ご依頼/相談/お問い合わせ
シグナル・コンポーズでは機械学習やシステム制作、音楽制作、Max/Max for Liveデバイス制作など、各種テクニカルなコンサルティングやディレクション、R&D、プロトタイピング、制作などお受けしています。何かあればお気軽に `info[at]signalcompose.com` にお問い合わせください。よろしくお願いします。会社概要等は以下のサイトをご覧ください。
色々製作やっています。コロナに負けずに頑張りましょう!!