渋谷で働くSEのブログ

渋谷で働くSEのお粗末なブログです

とりあえず音楽を分類してみよう

画像の分類についてはいろいろ研究されています。

しかし、音楽については、画像ほどは進んでいないようです。

そんな中で見つけた論文がこちら。

「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です。

mlp_rlu_conv2.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割前後ぐらいです。

これからやるべきことは、次のことです。

  • とりあえずクレンジングからやってみるか:重複をなくす

  • ネットワークそのものを書き換える:論文をじっくり読んでレビューしないと!

  • そもそも、同じ楽器を使い、同じリズムを刻んでいる時点でわかりにくくなっている。これじゃ人間でもそのぐらいの誤差は出す:だから諦めておく

という感じです。

私の実験ノートはまだまだ続きます。