音楽のジャンル分け(タグ付け)としてChoi氏のMusic auto-tagging using kerasがある。
ここでは、その派生でジャンル数を50から10へ変更した Music Genre Classification with Deep Learningの
CRNNモデルをChainer用にリメイクする。
オリジナルで使われているKeras/TheanoとChainerの間ではGRUの計算式が異なる。
GRUは、Keras/Theanoに似せた計算式へ変更したものを準備した。(gru2.py)
Batch Normalization(BN) については、移動平均の方法や定数が異なるところがあり、Chainer対応してもまったく同じ動作にならない。
暫定として平均値と分散の初期値を設定できるものを準備した。(batch_normalization2.py)
Keras 1.0.6とそれ以降では、BNに互換性が無い(挙動が違う)ようである。CNNモデルの方は1.0.6でないと正しく動かない。CNNモデルは分散の値を2乗するように変更した。
美しくないが、Kerasの BNのmode=2に似た動作にするため、テスト時に動的にBNを計算するためのフラグも追加した。
保存された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モデルの結果は不安定?でどことなく怪しいところがあるような気がしている。
python3 music-tagger-test.py
python3 music-tagger-test.py -m CNN0
python3 music-tagger-test.py -m CNN