音楽のジャンル分け

概要

音楽のジャンル分け(タグ付け)としてChoi氏のMusic auto-tagging using kerasがある。
ここでは、その派生でジャンル数を50から10へ変更した Music Genre Classification with Deep Learning
CRNNモデルをChainer用にリメイクする。

github repository

互換性の問題

gru

オリジナルで使われているKeras/TheanoとChainerの間ではGRUの計算式が異なる。 GRUは、Keras/Theanoに似せた計算式へ変更したものを準備した。(gru2.py)

Batch Normalization(BN)

Batch Normalization(BN) については、移動平均の方法や定数が異なるところがあり、Chainer対応してもまったく同じ動作にならない。 暫定として平均値と分散の初期値を設定できるものを準備した。(batch_normalization2.py)
Keras 1.0.6とそれ以降では、BNに互換性が無い(挙動が違う)ようである。CNNモデルの方は1.0.6でないと正しく動かない。CNNモデルは分散の値を2乗するように変更した。
美しくないが、Kerasの BNのmode=2に似た動作にするため、テスト時に動的にBNを計算するためのフラグも追加した。

conv

保存されたconv層の重み係数の配置が逆になっている。

その他の留意点

windows上でのTheano optimization failedを回避するため、


import theano
theano.config.optimizer='None'

をオリジナルに追加して動作確認した。

音楽のジャンル分け

Music Genre Classification with Deep LearningのCRNNモデル(ジャンル数10)と
Music auto-tagging using kerasの初期のCNNモデル(BNにmode2を使っているもの、ジャンル数50)仮称CNN0モデルと、
Music auto-tagging using kerasのCNNモデル(その後BNがmode=0に変更されている)の3種類の重みを使って2曲の予測実験をしてみた。
CNNモデルの結果は不安定?でどことなく怪しいところがあるような気がしている。

CRNNモデルによる予測の結果の例


python3 music-tagger-test.py

result_crnn

CNNモデルによる予測の結果の例


python3 music-tagger-test.py -m CNN0

result_cnn0


python3 music-tagger-test.py -m CNN

result_cnn

内容

参照したもの

ライセンス

docsディレクトリーの中にある以下のオリジナルのライセンス文を参照のこと。
LICENSE-music-auto_tagging-keras.md
LICENSE-chainer.txt