突然ですが、私は現在ディープラーニングを勉強中です。
そこで今回はディープラーニングについて調査中に見つけた「Neural Network Console」というツールがかなり使えるのでご紹介します。
Neural Network Consoleとは?
「Neural Network Console」はソニーが2017年8月に無償提供を開始したディープラーニングの統合開発環境であり、ニューラルネットワークの設計・学習・評価をグラフィカルに行えることができます。
※ディープラーニングについて
そもそもディープラーニングとは何なのでしょうか。
wikipediaによれば「多層のニューラルネットワークよる機械学習手法」とされています。
ここで出てくる「ニューラルネットワーク」は人間の脳内にある神経細胞(ニューロン)とそのつながりを数学的に扱いやすくモデル化したものであり、「機械学習」は人間が持つ学習能力をコンピュータ上で実現することです。
つまり、コンピュータに人間の脳構造を模させて学習能力を実現させようとするのがディープラーニングです。
ディープラーニングの最終的な利用方法は学習により最適化された多層ニューラルネットワークを使用して、画像や文字、事象といったものを予測・判定を行うことになります。wikipediaによれば「多層のニューラルネットワークよる機械学習手法」とされています。
ここで出てくる「ニューラルネットワーク」は人間の脳内にある神経細胞(ニューロン)とそのつながりを数学的に扱いやすくモデル化したものであり、「機械学習」は人間が持つ学習能力をコンピュータ上で実現することです。
つまり、コンピュータに人間の脳構造を模させて学習能力を実現させようとするのがディープラーニングです。
最終的な利用方法に行くまでに、目的に見合った様々な過程があります。
1. ニューラルネットワークの設計
2. ニューラルネットワークの実装
3. 学習データの収集
4. 学習による最適化
5. 最適化されたニューラルネットワークの評価(テスト)
「Neural Network Console」では1と3以外はかなり簡単にできるツールとなっています。2. ニューラルネットワークの実装
3. 学習データの収集
4. 学習による最適化
5. 最適化されたニューラルネットワークの評価(テスト)
「Neural Network Console」の実際の使い方はツールに付随してくる日本語のマニュアルに載っているので、使い方については省かせていただき、今回は入力された数字の画像を判定するニューラルネットワークをこのツールを使い作成し、学習と評価を行ってみようと思います。
Neural Network Console 導入手順
ダウンロードしたフォルダの中にセットアップからチュートリアルの手順が載っているので、ここではダウンロードまでの説明をします。ダウンロード
まず「Neural Network Console」のサイトに行きます。https://dl.sony.com/ja/
サイトに行ったら「Windowsアプリではじめる」をクリックします。
同意書に対する同意確認と、メールアドレスを入力するフォームがあるのでメールアドレスを入力後に「上記に同意して送信」をクリックします。
こんな感じのメールが来るので、「Download the Windows App」 をクリックします。
クリックするとツールのダウンロードが開始されます。
ダウンロードしたファイル「neural_network_console_110.zip」を解凍します。
場所はどこでも大丈夫ですが、ここではCドライブ直下に解凍します。
※ファイル名は2017/12/15時点のものです。バージョン等により変更される場合があります。
セットアップ
フォルダ内の「manual_ja.pdf」に日本語で以降のセットアップ手順とサンプルプログラムによるチュートリアルが載っているので参照してください。
※注意点として、「Visual Stadio 2015 C++ Redistributable Package」がインストールされているかの確認と、NVIDIA GPUを使用する場合についてドライバが最新であるかの確認をするポップアップが出ます。
ここでは基本的にCPUを使用するので、「Visual Stadio 2015 C++ Redistributable Package」がインストールされていれば大丈夫です。
「Visual Stadio 2015 C++ Redistributable Package」がインストールされていない場合はポップアップに記載されたURLからダウンロードしてインストールをお願いします。
ここでは基本的にCPUを使用するので、「Visual Stadio 2015 C++ Redistributable Package」がインストールされていれば大丈夫です。
「Visual Stadio 2015 C++ Redistributable Package」がインストールされていない場合はポップアップに記載されたURLからダウンロードしてインストールをお願いします。
チュートリアルのサンプルプログラム
マニュアル「manual_ja.pdf」で詳しい説明がなされているので、かいつまんだ説明となりますが、サンプルは入力された画像が数字の9であるかを判定するニューラルネットワークになっています。このニューラルネットワークは28×28の画像を入力に受け取り、0から1の間の値を出力をします。
出力は入力画像が9である確率を表していて、出力が1であれば画像が9と判定され、0に近づくと画像が9である確率が下がっていきます。
数字を認識するニューラルネットワークの作成
さっそくですが、数字を識別する簡単なニューラルネットワークを作成してみますサンプルでは入力された画像が9であるかの判定でしたが、ここでは0から9について分類をするニューラルネットワークを作成します。
まず、どのようなニューラルネットワークが適しているのかを調べます。
正直な話、ニューラルネットワークは直感で作れるわけではないので、論文やWeb上で処理に見合った構造を探して、それを元に作るしかありません。
ですが、言い方を変えればこのツールを使うと実装コードがなくても、構造を示す画像や各レイヤのサイズさえわかってしまえば、簡単に作成することができます。
画像認識の場合はCNN(「Convolutional Neural Network」)と言われるニューラルネットワークを使用するのが最適だそうです。
今回の作成する画像認識のニューラルネットワークの場合は「cnn ディープラーニング」でオーガニック検索して最も簡単そうなのをチョイスして作成しました。
ツールによるニューラルネットワークの実装は、ニューラルネットワーク構造に対応するコンポーネント(レイヤ、層)を置いて、サイズを指定し、それぞれを接続していくだけとなっています。
詳しくはマニュアルを参照してください。(ただし、各コンポーネントの説明は難しくてよく分からないと思います。私がそうでした)
作成したニューラルネットワークは入力は「INPUT」レイヤで28×28の画像データを入力として受け取ります。
最終的な出力はサイズ10の配列となり、配列のインデックスが判定候補の数字に対応し、値は入力がその数字となる確率となります。
入力された画像に対して、出力の配列が{0 , 0 , 0 , 0 , 0 , 1.0 , 0 , 0 , 0 , 0 }(インデックス5の値が1.0) と出力されれば入力された画像は5と判定されたということになり、
入力された画像に対して、出力の配列が{0 , 0.5 , 0 , 0 , 0 , 0 , 0 , 0.5 , 0 , 0 } (インデックス1の値が0.5 、インデックス7の値が0.5)と出力されれば入力された画像は1が50%、7が50%、つまり1か7の判別がついていない状態になります。
画像認識のニューラルネットワーク
学習
ディープラーニングでの学習とは、コスト関数と呼ばれる指標を0に近づけていくことにあります。コスト関数は各レイヤのパラメータ、学習データに対する出力と正解の差から生成され、今回のコスト関数の場合、端的に言うと以下のような性質をもつ形式になります。
正解が1と設定されている入力に対して出力が{0 , 0.5 , 0 , 0 , 0 , 0 , 0 , 0.5 , 0 , 0 } の場合はコスト関数が大きくなり、
正解が1と設定されている入力に対して出力が{0 , 0.9 , 0 , 0 , 0 , 0 , 0 , 0.1 , 0 , 0 } の場合はコスト関数が0に近づく。
学習では各レイヤのパラメータを最適化して学習データに対する出力と正解が同じになるようにしていきます。
学習用データ
今回は学習データとして0から9の手書きの画像60000件を使用します。「x:image」は28×28の入力画像、「y:label」は入力画像に対する正解の数字となります。
つまりindex=1のデータはy:label=5となっているため、画像の入力に対する出力の配列が{0 , 0 , 0 , 0 , 0 , 1.0 , 0 , 0 , 0 , 0 } となれば正解となります。
学習結果
マニュアルを参照していただければわかりますが、データさえ用意できていれば、学習はボタン一つでできます。(ニューラルネットワークの複雑さにより時間がかかりますが)実際に学習用データで学習させた結果が以下となります。
横軸は学習回数(Epoch)を示します。
青線がコスト関数の値、赤線が学習データの入力に対するエラー率です。
学習回数にしたがってコスト関数の値とエラー率が下がっています。
評価(テスト)
学習により各レイヤのパラメータが最適化されたら、次はそのパラメータを設定したニューラルネットワークの評価を行います。評価も学習と同じで、データさえ用意すればボタン一つで行なえます。
評価には学習用データとは異なるデータを使用します。
今回は10000件のデータを使用します。
評価結果
この表は評価データの正解と評価データをニューラルネットワークに投入して得られた結果のマトリックスです。対角の値が出力結果と正解の値が一致している件数でそれ以外は誤認している件数です。
Percision行が各数字の判定精度となっています。
平均が約99%の精度で判別が行えています。
アプリでの利用
このツールではニューラルネットワークの設計、学習、評価が行えますが、作成したニューラルネットワークをプログラムやアプリにに組み込むにはどうすればよいのでしょうか。エディット画面で右クリックをしコンテキストメニューから[Export]を選択するとpythonのコードを出力することができます。
出力されたpythonコードと最適化されたパラメータファイルを用いてアプリに組み込みます。
出力されるコードは「NNabla」といわれるこれもソニーが提供しているニューラルネットワークのライブラリで記述されています。
https://nnabla.org/
出力コード
import nnabla as nn
import nnabla.functions as F
import nnabla.parametric_functions as PF
def network(x, y, test=False):
# Input -> 1,28,28
# Convolution -> 16,24,24
with nn.parameter_scope('Convolution'):
h = PF.convolution(x, 16, (5,5), (0,0))
# ReLU
h = F.relu(h, True)
# MaxPooling -> 16,12,12
h = F.max_pooling(h, (2,2), (2,2))
# Convolution_3 -> 16,8,8
with nn.parameter_scope('Convolution_3'):
h = PF.convolution(h, 16, (5,5), (0,0))
# ReLU_3
h = F.relu(h, True)
# MaxPooling_2 -> 16,4,4
h = F.max_pooling(h, (2,2), (2,2))
# Affine -> 100
with nn.parameter_scope('Affine'):
h = PF.affine(h)
# ReLU_4
h = F.relu(h, True)
# Affine_2 -> 10
with nn.parameter_scope('Affine_2'):
h = PF.affine(h, (10,))
# SoftmaxCrossEntropy -> 1
h = F.softmax_cross_entropy(h, y)
return h
以上が「Neural Network Console」の紹介でした。次回はディープラーニングを使用して、ちょっとおもしろいことができればなぁと考えています。
ではまた次回に。