とりあえず音楽を分類してみよう
画像の分類についてはいろいろ研究されています。
しかし、音楽については、画像ほどは進んでいないようです。
そんな中で見つけた論文がこちら。
「Deep Learning and Music Adversaries」C. Kereliuk 外
です。
この論文で紹介された手法を実行するためのソースコードがGitHub - coreyker/dnn-mgrに公開されています。
そして、この通りにとりあえずやってみるんです。
GitHubに入ると、Readmeがあり、それに沿っていちおうできるっちゃできます…
が、ここではそれを日本語で解説します。
まず環境から…
- Python (Tested with version 2.7. Note Python 3 contains many changes that might introduce bugs in this code)
- NumPy
- SciPy
- PyTables (requires numexpr and libhdf5)
- Theano
- Pylearn2
- scikits.audiolab (and libsndfile)
- scikits-learn
となっていますが、「tested with version 2.7」だったら、python2.7を使うのが王道です。
python2系と3系は結構違います。
python2系から3系に翻訳してくれるプログラムとかもありますが、それやっても動かない場合もあります。
python2系で書かれているコードは、python2.7で動かしてください。
次はデータセットの準備
python prepare_dataset.py \ /path/to/dataset \ /path/to/label_list.txt \ --hdf5 /path/to/save/dataset.hdf5 \ --train_prop 0.5 \ --valid_prop 0.25 \ --test_prop 0.25 \ --partition_name /path/to/save/partition_configuration.pkl \ --compute_std --tframes 100
まず、データセットを作成しましょう。
データの教師となるラベルを作成します。それがlabel_list.txtです。
そして、--hdf5とは、データセットのhdf5ファイルを作るという意味です。名前はお好みで指定してください。
あと、train_prop, valid_prop, test_propは、交差検証のために使っている変数です。
ここでは、test_propが0.25、つまり1/4ということなので、 4-fold検証となるわけです。
最後のtframesは…
convolutional neural networkをやるとき指定する変数です。
fully connected、あるいはdropoutを実行するときはこれが要らないです。
(デフォルトのtframesは1です)
ちなみに、このtframesがreadmeに追加されたのは、私が質問してからです…
実験しながら、どうしてもconvolutionだけがうまくいかなかったので質問しましたら、 即返事してくれて、そしてこれを追加してくれたみたいです。
そして別の方法として
python prepare_dataset.py \ /path/to/dataset \ /path/to/label_list.txt \ --hdf5 /path/to/save/dataset.hdf5 \ --train /path/to/train_list.txt \ --valid /path/to/valid_list.txt \ --test /path/to/test_list.txt \ --partition_name /path/to/save/partition_configuration.pkl \ --compute_std --tframes 100
が紹介されていますが、こちらは「まずデータセットのtxtファイルを作成してからやる方法」 となります。
こちらは省略させていただきます。
ちなみにちなみに…
ここでは、mp3をwavに変換するソースコードを用意してくれていますが、 大変残念なことに動きません。
soxとかダウンロードして使ってください。
その方がずっと楽ですw
学習しよう
データセットを用意したら、次は学習です。
python train_mlp_script.py \ /path/to/partition_configuration.pkl \ /path/to/yaml_config_file.yaml \ --nunits 50 --output /path/to/save/model_file.pkl
このtrain_mlp_script.pyは、fully connected networkもしくはdropout用です。
fully connectedのためのyamlスクリプトがmlp_rlu.yaml、dropout用がmlp_rlu_dropout.yamlです。
python train_mlp_conv_script.py \ /path/to/partition_configuration.pkl \ /path/to/yaml_config_file.yaml \ --output /path/to/save/model_file.pkl
しないといけません。
ちなみにちなみにですが…
自宅のMacBook Pro(2013年モデル、CPUモード) だと、fully connectedやdropoutは1epochあたり1時間ほどかかり、 convolutionalだと一晩かけてやってました。
それでも終わらなかったら朝ごはん食べながらやって、 それでも終わってなかったら休止状態にして出勤して、帰宅後また回してました。
confusion matrixを作成しよう
学習したモデルの性能を評価するためには、confusion matrixを作ります。
結果を見るだけで十分な場合は、上で作られたモデルファイルを使ってターミナル上にconfusion matrixを表示します。
python test_mlp_script.py \ /path/to/saved/model_file.pkl \ --majority_vote
ファイルで出力したいときは、データセットのファイルとモデルファイルを両方指定し、出力したいconfusion matrixの名前を指定してあげます。
python test_mlp_script.py \ /path/to/saved/model_file.pkl \ --testset /path/to/alternate/partition_configuration.pkl --save_file /path/to/savefile.txt
これでとりあえずSan JuanitoとTobasを分類すると…
何も考えずに分類してみました。 音源の長さもそのままにして、データのクレンジングも行わずに
San Juanito 131個 / Tobas 121個
についてやってみると、
たったの二値分類なのに正確度が8割前後ぐらいです。
これからやるべきことは、次のことです。
とりあえずクレンジングからやってみるか:重複をなくす
ネットワークそのものを書き換える:論文をじっくり読んでレビューしないと!
そもそも、同じ楽器を使い、同じリズムを刻んでいる時点でわかりにくくなっている。これじゃ人間でもそのぐらいの誤差は出す:だから諦めておく
という感じです。
私の実験ノートはまだまだ続きます。