SoundNetをベースにしたmusic2vecを用いた音楽ジャンルの分類(参考:https://medium.com/@rajatheb/music2vec-generating-vector-embedding-for-genre-classification-task-411187a20820)
Rajat Hebbarの記事のSoundNet + Stacked-LSTMモデルを参考にしたSoundNetをベースにしたmusic2vecを用いた音楽ジャンル分類モデルの実装。
GTZANのデータを用いた音楽ジャンル分類を学習させた後、テストデータでの推論結果を混同行列にまとめ、Accuracy・Precision・Recall・F1の値を求めた(Precision・Recall・F1はデータ数で重みを付けて平均をとった)。
また、学習前と学習後でモデル中のSoundNetの部分の出力を平坦化したものをPCAやt-SNEで可視化した。
music2vecディレクトリにはモデルの実装、学習を簡単にできるようにモジュールとしてまとめており、パッケージとして利用することが可能。
Google Colaboratory上にこれらを実行したものをまとめている(music2vec.ipynbと同じもの)。
- Python 3.7.10
- Tensorflow 2.4.1
- numpy 1.19.5
- librosa 0.8.0
SoundNetの論文3ページ目の"2 Large Unlabeled Video Dataset"に従い、入力音源はサンプリングレート22050Hzにし、-256から256までの範囲の数値にした。
Rajat Hebbarの記事で紹介されている上の写真のモデルをもとに、下のモデルを作成した。
SoundNetベースのCNNを実際のSoundNetに変えたのが主な変更点。
それによりCNNの層が増えて入力を長くする必要が出てきたため、入力サイズが大きくなった。
GTZANに含まれる1000個の音楽データの内950個を訓練データとして学習させ、10epochs後と20epochs後に50個のテストデータで推論させて混同行列の作成とAccuracy・Precision・Recall・F1の求値を行った。
ここで、Precision・Recall・F1の値は各ラベルごとの値をデータ数に応じて重み付けをして平均したものである。例えば、下のような混同行列であれば下の計算式によりPrecisionはおよそ0.58になる。
また、学習前と学習後でモデル中のSoundNetの部分の出力を平坦化したものをPCAやt-SNEで可視化した。 学習後ではt-SNEでジャンルごとにある程度分離されていることがわかる。特にclassicalやmetalはよく分離されている。