Tutorial実装で確認するTensorFlow⑥(Simple Audio Recognition_後編)|DeepLearningの実装 #7

f:id:lib-arts:20190530161346p:plain

連載の経緯につきましては#1でまとめています。

#1ではKeras、#2以降ではTensorFlowについてまとめています。
#6では音声認識のシンプルな例として、Simple Audio Recognitionの前編として概要の把握やTutorialコードの実行、結果の確認まで行いました。

また、背景知識の確認ということで、Simple Audio Recognitionに用いられているネットワークアーキテクチャについては下記の記事で確認を行いました。

#7ではこれを受けて、サンプルコードの実装の確認を行っていければと思います。
以下目次になります。
1. 簡単な復習&実装の確認にあたっての目標の設定
2. サンプルコード実装の確認
2-1. 処理の全体像の把握
2-2. CNNのネットワークアーキテクチャの定義の把握
2-3. 音声データから入力データへの変換の前処理の把握
3. まとめ

 

1. 簡単な復習&実装の確認にあたっての目標の設定
1節では簡単な復習と、実装の確認にあたっての目標の設定を行えればと思います。まず復習ですが、実行したサンプルコードの概要としては、音声データを元にした12クラス分類問題を解いています。学習ステップとしてはデフォルトで18,000ステップの計算を行っています。

また、上記の記事で確認した処理の流れについてですが、"Convolutional Neural Networks for Small-footprint Keyword Spotting"という論文を参照しており、こちらのネットワークアーキテクチャを参考にしているとのことでした。

f:id:lib-arts:20190613175841p:plain

この論文におけるCNNについては上図のようにt(time)とf(feature)の二つの次元をインプットとして、処理を行っています。featureの抽出にあたってはlog-mel filterbankなどの音素特徴量の抽出の手法が用いられているようでした。

上記を踏まえ、実装の把握の目標を以下に定めます。

====
・処理の全体像
・CNNのネットワークアーキテクチャの定義
・音声データから入力データへの変換の前処理

2節では上記を元にサンプルコードの実装の確認を行なっていきます。


2. サンプルコード実装の確認
2-1. 処理の全体像の把握
まずは処理の全体像の把握を行います。スクリプト実行を行っているため、まずはtrain.pyを確認しましょう。

tensorflow/train.py at master · tensorflow/tensorflow · GitHub

最終行が"tf.app.run(main=main, argv=[sys.argv[0]] + unparsed)"なので、def main()にメインの処理が記述されていることがわかります。

f:id:lib-arts:20190613190340p:plain
まずは上記のmain関数を確認していきます。TensorFlowの実装の流れとしては、(1)処理グラフの構築、(2)学習&保存、(3)推論&検証が主な流れかつコードが固まりとして記述されていることが多いので、それを意識しながら読み進めていきます。

f:id:lib-arts:20190613190400p:plain
中身を確認していくと、上記のようにTraining loopの箇所を発見することができ、forループを見つけることができます。またこの中にsess.runを用いてtrain_stepを実行していることがわかります。sess.runを用いた記述方法の場合はTensorFlowの学習部分はループ処理の中に記述されるのが基本パターンなので、ここで学習を行っているというのがわかります。
sess.runを用いた記述の場合は、引数としてグラフを与えるのでそちらの変数を遡ればネットワーク構造の実装を把握することができます。また、ネットワークの入力データはfeed_dictでデータを与えるので、feed_dictで与えているデータの作成に関して遡って把握すれは前処理について把握できることがわかります。
上記で述べた内容を参考にすれば2-2と2-3の目標は達成できそうなため、2-1での確認はここまでとします。

2-2. CNNのネットワークアーキテクチャの定義の把握
2-1節で確認したtrain_stepが学習ステップと予想できるため処理を遡ると、下記のようにtf.train.GradientDescentOptimizerにおけるminimizeメソッドにcross_entropy_meanを与えています。

f:id:lib-arts:20190613191148p:plain
cross_entropy_meanは誤差関数の役割を果たしていると思われる(読解時は推測ですが確認したところ、誤差関数でした)ため、遡っていくと下記のようにground_truth_input(正解ラベルのようなもの)、logits(予測結果)の二つを引数とした関数が実装されています。

f:id:lib-arts:20190613191208p:plain
このlogitsが予測モデルからの出力なので、次にlogitsを確認します。

f:id:lib-arts:20190613191459p:plain
すると上記のようにmodels.create_model関数を用いてモデルの構築を行っています。すなわち同一ディレクトリ下のmodels.pyのcreate_model関数を確認すれば良いということがわかります。

f:id:lib-arts:20190613192118p:plain

tensorflow/models.py at master · tensorflow/tensorflow · GitHub

ここからは上記のmodels.pyのcreate_model関数を確認していきます。

f:id:lib-arts:20190613192146p:plain
create_model関数では上記のようにmodel_architectureの内容で分岐処理を行っており、このmodel_architectureはスクリプト実行時のデフォルトの設定でparserを用いて"conv"が与えられるので、create_conv_model関数を確認すれば良いことがわかります。

f:id:lib-arts:20190613192210p:plain

(中略)

f:id:lib-arts:20190613192233p:plain
上記を確認することで畳み込み層の実装に関して確認することができます。


2-3. 音声データから入力データへの変換の前処理の把握
前処理に関しては2-1のfeed_dictから遡ることで実装を確認することができます。

f:id:lib-arts:20190613192820p:plain

tensorflow/train.py at master · tensorflow/tensorflow · GitHub

上記においてground_truthについては教師データを基本的には表すので、"fingerprint_input: train_fingerprints"について着目します。

f:id:lib-arts:20190613193304p:plain
train_fingerprintについては上記で値が代入されており、audio_processor.get_data関数が用いられています。

f:id:lib-arts:20190613193324p:plain
audio_processorは上記のようにinput_data.AudioProcessorでクラス生成されているので、同一ディレクトリ下のinput_data.pyで実装されているAudioProcessorのget_dataメソッドを確認すれば良いということがわかります。

f:id:lib-arts:20190613224844p:plain

tensorflow/input_data.py at master · tensorflow/tensorflow · GitHub

上記がAudioProcessorのget_dataメソッドですが、返り値のdataを生成するにあたって、sess.run(self.output_)->data_tensor->dataの流れになっています。したがって、self.output_の実装を探せば良いことがわかります。

f:id:lib-arts:20190613224917p:plain
self.output_については上記で設定しており、デフォルトではmodel_settings['preprocess']は'mfcc'となっていることから、MFCCで音素特徴量を生成しているらしいということがわかります。

f:id:lib-arts:20190613225146p:plain
上記の読み込み元を見ると、contrib_audio.mfccはTensorFlowのライブラリ側で実装されているようだったので、TensorFlow側で実装されているMFCCを動かして音素特徴量を生成しているらしいということがわかります。
前処理に関して大体の概要はつかめたので、2-3はここまでとします。


3. まとめ
#7では#6で動かしたSimple Audio Recognitionの実装の把握を行いました。
大体の概要は把握できたので、#8以降ではまた違ったテーマについて取り扱えればと思います。