【TensorFlow】ニューラルネットワークで周波数スペクトルを学習して、楽器音色を推定する【Python】
どうも、たっきーです。
ぷっちょ(マスカット)が好き。
なにする?
今回のタスクは「音源同定」。
そのタスク達成するためのツールは「機械学習」。
単一の楽器が鳴っている生音ファイル(.wav)を複数用意して、データセットとする。
今回は単層のニューラルネットワーク(NN)という機械学習のアルゴリズムを使って、音源同定をこなしていきたい。
TensorFlowの使い方は以下の本を参照。
TensorFlowで学ぶディープラーニング入門 ~畳み込みニューラルネットワーク徹底解説~
- 作者: 中井悦司
- 出版社/メーカー: マイナビ出版
- 発売日: 2016/09/27
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る
モチベーション
(機械学習)エンジニア男子はモテるらしい。
モテたいので頑張る。
まぁ、僕はJKなんですけど。
エンジニア男子がどのくらい最高かっていうと、一度エンジニア男子と付き合ったら二度とエンジニア男子以外を好きにならないぐらい最高だよ。
— りりそん@浦田理絵 (@ririson_jp) 2017年12月13日
彼らは頭が回るしひねったジョークも上手いし俗世のくだらないことたちと距離を置いているからね。
最高にユニークでセクシーでクールなんだよ!!!!!!!
環境
ニューラルネットワーク(NN)とは
人間の神経回路網を模した数式的なモデルのこと。
NNは、入力層、出力層、隠れ層から構成され、層と層の間には、ニューロン同士の結合の強さを示す重みがある。
難しいことはわからないので割愛。
データセットの用意
AppleLoopにあるヤァツをWAV形式で書き出してチョキチョキする。
最近知ったんだが、研究用のデータセットがあるらしい。産業技術総合研究所から出てる。
RWC Music Database (in Japanese)
もっと早く知りたかった()
まぁ、今回は折角AppleLoppsからデータセット作ったのでそれを使って行きたい。
↓こんな感じで楽器毎に音源が用意されている。
前回に書いたやつでデータセットにする。
流れ
- 楽器毎のデータセット作成
- 一秒ごとに切り取る
- ステレオ→モノラルに変換
- 学習用データとテスト用データを分ける
- FFTで周波数解析して周波数スペクトルを求める
- 0〜1で正規化
- それぞれの音源に対応する楽器のラベルデータを付ける
- NNで周波数スペクトルを学習
- 学習結果を元にテスト用データがどの楽器か推定
コード
まずはimport系と種まきとWAVの読み込み系とFFT系を定義。
次にデータセット系を定義。
主に各々でイジるところ。ディレクトリ名を入れればいい。今回はエレキギターとベースの分類を行ってみる。
次にNNをTensorFlowでつくる。
とうとう学習ステップ。
結果
['Eguitar', 'Bass']Step: 100, Loss: 155.835200, Accuracy: 0.505000 Step: 200, Loss: 141.524743, Accuracy: 0.560000 Step: 300, Loss: 135.902021, Accuracy: 0.595000 Step: 400, Loss: 103.269195, Accuracy: 0.835000 Step: 500, Loss: 76.209220, Accuracy: 0.920000 Step: 600, Loss: 53.022086, Accuracy: 0.925000 Step: 700, Loss: 40.102229, Accuracy: 0.955000 Step: 800, Loss: 34.835865, Accuracy: 0.960000 Step: 900, Loss: 31.750563, Accuracy: 0.955000 Step: 1000, Loss: 32.527884, Accuracy: 0.965000 Step: 1100, Loss: 36.188868, Accuracy: 0.950000 Step: 1200, Loss: 26.584764, Accuracy: 0.965000 Step: 1300, Loss: 27.493180, Accuracy: 0.970000 Step: 1400, Loss: 26.846440, Accuracy: 0.965000 Step: 1500, Loss: 37.596496, Accuracy: 0.930000 Step: 1600, Loss: 27.732768, Accuracy: 0.965000 Step: 1700, Loss: 31.237676, Accuracy: 0.960000 Step: 1800, Loss: 29.663903, Accuracy: 0.960000 Step: 1900, Loss: 29.423946, Accuracy: 0.960000 Step: 2000, Loss: 35.136697, Accuracy: 0.960000
Stepが学習ステップ。Lossが損失関数。Accuracyが認識成功率。
ハイパーパラメータ達
1 |
|
ノードの数 |
4096 |
FFTのサンプル数 |
1024 |
窓関数 |
ハミング窓 |
オプティマイザ |
Adam |
学習率 |
0.0001 |
活性化関数 |
注意点
/Users/tacky0612/anaconda3/lib/python3.6/site-packages/numpy/core/numeric.py:531: ComplexWarning: Casting complex values to real discards the imaginary part return array(a, dtype, copy=False, order=order)
という警告文が出る。どうやら計算の過程でNaN(欠損値)が出ちゃうかもよーってことらしい。
無音の音源があるとmax(abs(data))が0になってしまうので0で割り算してしまうのでNaNが発生してしまうので注意。
dtype=tf.float64 を指定しないと計算途中でオーバーフローしちゃうので注意。(デフォルトでtf.float32)
TensorFlowで学ぶディープラーニング入門 ~畳み込みニューラルネットワーク徹底解説~
- 作者: 中井悦司
- 出版社/メーカー: マイナビ出版
- 発売日: 2016/09/27
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る
Learning Tensorflow: A Guide to Building Deep Learning Systems
- 作者: Tom Hope,Yehezkel S. Resheff,Itay Lieder
- 出版社/メーカー: Oreilly & Associates Inc
- 発売日: 2017/08/27
- メディア: ペーパーバック
- この商品を含むブログを見る
退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング
- 作者: Al Sweigart,相川愛三
- 出版社/メーカー: オライリージャパン
- 発売日: 2017/06/03
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (5件) を見る
おわりに・感想
今回はエレキギターとエレキベースの分類を試みたけど、周波数スペクトルを学習してるので、この結果はそりゃあたりまえかぁって感じ。
データセットの関数、めちゃめちゃ適当に書いたのでもうちょっと綺麗にしたい(そのうちやる(多分。。。))
うーん、、、同一の楽器でも音高・音の強さ・楽器の個体差・奏法・などによって特徴が変動するので、単に周波数スペクトルを見るだけじゃちょっとしんどいかなぁ。。。ってのが正直な感想。
今後の展開としてニューラルネットワークを多層化してみようかなーって感じ。
最近また同じようなことやってる論文を読み漁ってるんだけど、僕の頭めちゃ弱いので理解できない事だらけなので理論弱者になってる。。。
けんきうしつに着いたらアンパンマンが飛んでた pic.twitter.com/zZiSwJaASx
— たっきー@ダサテプラP (@tacky0612) 2017年12月14日