チュートリアル:学習されたニューラルネットワークの途中出力を分析する

Monday, December 25, 2017

App , Cloud

Posted by Yoshiyuki Kobayashi

本チュートリアルでは学習済みのニューラルネットワークについて、ネットワークの途中でどのようなデータが出力されているのかを表示する方法を紹介します。
今回は題材として、Neural Network Consoleに学習結果のニューラルネットワークも同梱されているMNISTデータセットを用いたLeNetサンプルプロジェクトを用います。

学習済みニューラルネットワークを係数付きで読み込む

学習済みニューラルネットワークを用いた分析を行うために、まずTRAININGタブの学習結果を右クリックして表示されるポップアップメニューからOpen in EDIT Tab with Weightを選択し、学習済みニューラルネットワークを係数付きでEDITタブに読み込みます。



学習済みニューラルネットワークを係数付きで読み込む

この操作を行うことで、EDITタブ内の各レイヤーには初期値として学習済み係数が設定されます。



Convolutionのプロパティ、W.File、b.Fileにそれぞれ学習済み係数が設定されている

途中結果出力用のネットワークを設計する

EDITタブで新しいネットワークを追加し(仮に名前をActivationMonitorとします)、Mainネットワークからコピー&ペーストしたネットワークを以下のように編集します。



ActivationMonitorネットワーク

新たに追加したIdentityレイヤーは、入力結果をそのまま出力するという結果に何の影響も与えないレイヤーです。図のように、結果をモニタしたい箇所(Convolution、Convolution_2の出力)に接続した上でレイヤー名に出力名(ConvOut、ConvOut_2)を指定することで、ネットワークの任意の箇所の出力結果をモニタする目的のために使用することができます。

評価実行時に追加したネットワークを評価するように設定する

CONFIGタブでExecutor(評価実行時に用いるネットワークの設定)を追加し、先ほどモニタ用に追加したNetworkであるActivationMonitorを追加します。



評価実行時用ネットワーク設定の追加

この設定により、評価実行ボタンより評価を行った際にActivationMonitorネットワークが評価されるようになります。結果的に、評価出力にActivationMonitorネットワーク内でIdentityレイヤーを用いて指定した箇所の内容が出力されます。

学習を行わず、設定結果を反映する

ここまででConvolution、Convolution_2の出力結果を確認するための設定は完了しましたが、評価実行は学習を実行した時点の設定に従って行われるため、このままでは学習後に追加した設定を用いた評価を行うことができません。かといって再度学習を行うには余計な時間がかかってしまいます。

このような場合は、学習実行ボタンを右クリックして表示されるポップアップメニューから「Create Training Result」を選択するか、CONFIGタブのGlobal ConfigでMax Epochを0とした学習を行います。



Create Training Resultを選択

Create Training Resultを実行することにより、一切学習を行わずに学習結果をファイル出力することができます。冒頭で学習済みニューラルネットワークから読み込んだパラメータは、そのままの状態で学習結果のファイルに出力されることになります。

Create Training Resultを実行すると、処理は比較的すぐに終了しTRAININGタブに結果が表示されます。処理が終了したら早速評価実行ボタンを押して、Convolution、Convolution_2の出力結果を確認してみましょう。評価処理ではActivationMonitorネットワークで指定したConvolution、Convolution_2の出力結果が全て画像としてファイル出力されるため、評価完了までにはそれなりの時間を要します。

ネットワークの途中出力結果を確認する

EVALUATIONタブでネットワークの途中出力結果を確認します。各評価データについてConvOutとしてConvolutionの出力である16枚の画像、ConvOut_2としてConvolution_2の出力である30枚の画像を確認することができます。



Convolutionの出力結果の確認

出力される画像は、輝度0が0.0の入力値に、輝度255が1.0の入力値に対応します。Identityレイヤーの前にAddScalarレイヤーやMulScalarレイヤーを用いることで、より広い範囲の値を出力画像に反映させることもできます。例えば、Valueプロパティが0.5であるMulScalarと、Valueプロパティが0.5であるAddScalarをIdentityレイヤーの前に挿入することで、-1.0から1.0の範囲の入力値を画像として出力することができます。



-1.0から1.0の範囲の入力値を画像として出力