英語って、覚える量半端ないな…
相変わらず工業英検勉強してます。
11月にTOEIC speaking & writingも受けるつもりですが、
こちらまではまだまだ手が回りません。
今日は、こんな表現を覚えました。
「Aは広く応用されている」
A is wide in the range of A's application
うあ…
文ごとに覚えるなんて、長いですね。
しかし…だからこそ英語や欧米系の言語は若いうちにならておかないといけないかもしれないな…とつくづく感じます。
こちらの本も私のとってはかなり難しかったですが…
夢をかなえる英作文 ユメサク 【CD・赤シート付】 (英語の超人になる!アルク学参シリーズ)
- 作者: 木村達哉,西山哲郎
- 出版社/メーカー: アルク
- 発売日: 2013/10/31
- メディア: 単行本
- この商品を含むブログを見る
(まず英語より日本語が難しいというレベルです、正直この本は)
工業英語はこれをはるかに超えてましたね。
はぁ、ムズい…(ため息)
しかし、私が本当に身につけたい英語は科学技術英語なので、
辛抱強く向き合っていかないといけないと思っています。
論文の「再現実験」(4)よっしゃー
昨日は「もう学習あきらめる」と言っていましたが、
まだまだ続けております…実は。
やっぱり「最初の120秒」は時間がかかるので、
- convolutionの一番浅いhidden layerは4×400から100×16に
- 最初の30秒だけ
- tframeは150
にすることにしました。
そうしましたら、30分ぐらいで0epochに移ってくれました。
よっしゃーキタキタ0エポック!!!!!!!!!!!!!!!!!
というわけで、実験はまだ続いております。
だいたい24エポックと言っています。
今回は面倒だったのでクレンジングは行いませんでしたが、
次はクレンジングも行わないといけないでしょうね。
ついさっき、0エポックが終わりました。
24分かかったそうです><
この実験、かなりブラックですね。
コンピュータをひたすら酷使するという-_-
工業英検の勉強をしながら感じたこと
工業英検の勉強をしています。
私は数学科の出身なので、機械にはあまり詳しくありません。
なので、機械系の作文は本当に難しいんです。
そして、受験英語(こっちはわりと生活英語に近いと思いますが)とも結構違います。
受験英語だと主語がI/We/Peopleになるはずのところが、
工業英語だと、物質や機械、実験などが主語にならないといけません。
たとえば、「実験が行われる」という文を書くとしたら、
受験英語だと"Many researchers studied~/executed experiments"となりますが、
これが工業英語になると"Several experiments were executed"となるわけです。
私は工業英語準2級を受ける予定ですが、残念ながら準2級の教材はありませんので、
仕方なく2級の教材で勉強しています。
準2級だったらちょっと勉強したらすぐ点数あげられそうだな…
と思いましたが、2級は準2級よりはるかに難しいですT_T
話を戻しますと、
そもそも英語が難しいのか、工業の知識に慣れていないのかわからなくなるぐらいです。
とはいえ、数学英語もまともに書けないんですけどねw
今はそれのリベンジとして英語を勉強しまくっているようなもんです。
たまには、語学留学行きたいなんて思っていたりします。
しかし、私は学部卒の人と比べると就職が6年も遅れてしまいましたので、
そんなことなんて考えちゃいかん、と、
そんな思いをぐっとこらえながら仕方なく独学を続けています。
正直、勉強は好きですが、25過ぎてからの学生ってつらいもんですからね。
世間の目は冷ややかで、先はどんどんわからなくなっていくばかりで、
生涯賃金は凄まじい勢いで減っていくんですからね。
というわけで、私はやっぱり独学を続けていこうと思います。
論文の再現実験:convolution layerをかえてみた
layerとかいろいろ変えてみました。
ちょうど全編で言っていたとおりプログラムをいじってみて、またnetworkの方も変えてみましたが、
1epochに1時間以上かかりそうです。
かけてみたところ、まったく反応がありません…
最初の30秒ではなく、120秒をnetworkにかけるようにプログラムを変えましたが、かなり無理があったようですね。
今すでに1時間ほど経っているのに、0epochすら終わってないです。
これはさすがに無理だったぽいです。
コンピュータのスペック上げたいです(悲鳴)
そしてそして。
私が読んでいた論文は2014年のやつですが、
これよりもさらにnetworkを深くしたものが最近発表されました。
あともう一つ。
midiから自動作曲してくれるオープンソースのmagenta(tensorflow基盤)が出たばかりなのに、
今度はGoogle DeepMindで「WaveNet」という、音声ファイル自動生成のアプリ?を開発したそうです。(こちらは有料か無料かわかりません)
時代を感じますね。
3年前産業界数学スタディーグループに参加したときは、「まさか学生にディープラーニングやらせるわけにはいかないだろう」と言われていました。
普通にR使って、k-meansとかやってた記憶があります。
(途中インフルエンザにかかってしまい、最終日は参加できませんでした)
なのに、今は、マシーンさえちゃんとそろえておけば、自宅でもディープラーニングとか手軽にできてしまいますね。
magentaぐらいなら、普通のノートパソコンで手軽にできちゃいますし。
いろいろ雑談が長くなりました^^
結論…
今のところは8割ぐらいの正確度に満足しておいて、deconvolution(convolutionの逆。特徴量抽出のためにやること)をやったり、出来上がったモデルに音楽をくわせてみて判別をさせてみたりした方がいいかもしれませんね。
いい加減razor core発売してくれないかな…
音楽のジャンル分類の論文解説(2)ちょっと自分の理解に間違いがあったようです
自分の理解にちょっと間違いがあったようです。
時系列そのものを一つの塊にするとか、100分割するとかではなく、
時系列の方も分割しておいて、それを一つずつ見ていくか、それとも100個ずつ見ていくか、という問題でした。
例の論文で使われた手法だと、時系列の1分割の長さは約46msです。
周波数軸には、513分割しています。
あとは、学習するとき513×1行列を流していくか、あるいは513×100行列を流していくかという問題となります。
今のところ考えていることは、
513×100ではなく、513×200行列を流していき、
一番浅いconvolution層のフィルタを400×4ではなく、16×100ぐらいにしてみることを考えています。
なぜ時間の方を100にするかというと、ちょうど100になるとdurationが4.6秒になるからです。
ちなみにSan Juanitoの1かたまりのdurationがだいたい5秒です。(ざっくりですが)
STFTそのものをすごいきちんと理解しているわけではありませんが、
論文読みながらなんとなく間違いに気づいたので、ちょっと一言だけ書きたかったです。
STFTについてはこちらを参照してください。
ではでは。
音楽のジャンル分類の論文解説(1)標本化と量子化
音声データや画像データなどといった連続データを扱うためには、コンピュータが認識できる離散データに落とす必要がありますね。
どういうことかというと、「ド」と「レ」の間には、中間の音なんかがいくらでもあるわけです。
C4=261.63Hz,
D4=293.66Hz
だそうなので、無茶なことをいうと、Hzなんて、世の中に存在するわけなんです。
しかし、このぐらいの波長だと、C4の音に非常に近いため、きっと人間はこれをC4の「ド」として認識するはずです。
このように、入力値に「目盛」をつけるのが量子化です。
そして標本化。
要するに、連続データを標本で区切ることです。
音楽だったら、例えば再生時間4分の音楽だと、分の瞬間だって当然あるわけですが…
こんなこと考えないで、0秒から0.01秒、0.01秒から0.02秒…
みたいに区切っていくわけです。
イメージでいうとこんな感じです。
まあ、こういう内容は、いろんなところに説明されているものです。
こちらとか参考にしてください。
そしてそして、本題に入ります。
私が見ているこの論文では、周波数を513分割、時間を100分割し、そのスペクトラムを画像処理で用いられるようなconvolutional neural networkで分析しています。
サンプリングの手法としてはSTFT(Short Term Fourier Transform)を使っていますが、ここのところがまだ理解しきれてないので、まだまだじっくり調べています。
そして、論文を読み進めていきますと、convolutional networkの最も浅いhidden layerのfilter sizeを400×4(周波数側が400)にし、ハーモニーの違いから音楽の特徴を捉えていきたいという話が出てきます。
しかし、私は、ハーモニーではなく、むしろ時系列に注目したいので、周波数側の目盛を荒くし、時系列側の目盛を細かくしていかないといけないのではないかと思っています。
クラシックとロックは、使われるコード(chord)が違います。なので、その違いから攻めていくことは妥当だと思います。
しかし、TobasとSan Juanitoの場合は、そういった違いはあまり見られないため、そもそもサンプリングの方法を変える必要があるかもしれません。
そして、時系列で特徴をとるために、ネットワーク側もちょっといじる必要が出てきます。
周波数側はもっと狭くし、時間側の幅ははもっと広くするとよいかな、と思います。
なので、サンプリングについてまたじっくり勉強してからもう一回実験をしてみようと思います。
またうちのCPUが苦労するでしょうが。
CPUちゃん、ご苦労様;_;
とりあえず音楽を分類してみよう
画像の分類についてはいろいろ研究されています。
しかし、音楽については、画像ほどは進んでいないようです。
そんな中で見つけた論文がこちら。
「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です。
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割前後ぐらいです。
これからやるべきことは、次のことです。
とりあえずクレンジングからやってみるか:重複をなくす
ネットワークそのものを書き換える:論文をじっくり読んでレビューしないと!
そもそも、同じ楽器を使い、同じリズムを刻んでいる時点でわかりにくくなっている。これじゃ人間でもそのぐらいの誤差は出す:だから諦めておく
という感じです。
私の実験ノートはまだまだ続きます。