機械学習に挑戦(3)
NNCで0~9までの数字を判別してみた

どもです。
前回のエントリで、NNCに予め含まれているサンプルプロジェクトを用いて画像が「『4』か『9』か」を判別してみました。
そこで今回は、これを少しだけ発展させて、画像が「『0』~『9』のどの数字か」を判別してみます。

1. 画像データ

まずは、トレーニングで使用する画像データです。
画像データは、MNISTのデータを使用します。
必要なデータは、前回紹介したサンプルプロジェクトの実行時にダウンロード済みです。
そのため、今回のエントリで何か手順を実施する必要はありません。
ダウンロードがてきている場合には、「sample_dataset」フォルダに「MNIST」フォルダができていると思います。
このフォルダの有無を以て、データがダウンロード済みか否かを確認してください。



なお、MNISTからダウンロードしたデータはには、「training」と「validation」が含まれています。
今回のエントリでは、「学習」には「training」フォルダを、「評価」には「validation」フォルダの画像をそれぞれ使用します。

2. データセット

次は、トレーニングで使用するデータセットです。

2.1. データセットのフォーマット

ここでいう「データセット」とは、「NNCが規定するフォーマットに従ったデータ」を示します。
この「フォーマット」は、簡単に書くと以下のようになります。

  • CSV形式
  • 1行目はヘッダ行
    各行のデータの変数名(ルールあり)を記載する。
    • 変数名は任意の文字列を使用可能
      通常、入力をx、出力をyとする。
    • 入力/出力がそれぞれ複数ある場合には、各変数名の末尾に1、2、…と添え字を付加する。
    • 入力変数は、出力変数よりも左側に設定されていること。
  • 2行目以降がデータ

このフォーマットに従い、今回の目的に合致するデータセットを作成する場合、以下のようなフォーマットになります。

(画像ファイルへのパス),(画像が0か否か),(画像が1か否か),(画像が2か否か),…(画像が9か否か)

なお、このフォーマットにおいて「画像がnか否か」は「1」と「0」で表します。
(「1」が「真」を、「0」が「偽」です。)

2.2. データセット(.csv)の作成

作成すべきデータが分かったので、実際にCSV形式のデータを作成してみます。
…と思ったのですが、対応するデータセット(.csvファイル)がMNISTのデータセットの中に作成されていました。
対応するファイルとしては「mnist_training_onehot.csv」です。
(※NNCでMNISTのデータをダウンロードする際に、自動で生成しているようです。)
そのため、今回はこのデータをそのまま使用します。

なお、評価用データも「mnist_test_onehot.csv」というファイル名で用意されています。

2.3. データセットのNNCへの登録

次は、データセットのNNCへの登録です。

NNCを起動し、ホーム画面を表示します。
ホーム画面の左辺位から「データセット」を選択し、[データセットを開く]を選択します。



[開く]ダイアログが表示されるので、データセット(.csv)の作成で紹介したcsvファイルを選択します。
なお今回は、学習後に評価も実施しますので、評価用データ(mnist_test_onehot.csv)も登録します。

以上で、使用するデータセットの用意は完了です。

3. プロジェクト

データセットの用意ができたので、いよいよ学習を実施してみます。

まず、プロジェクトを作成します。
ホーム画面の[+新しいプロジェクト]をクリックする、あるいは[Ctrl + N]を実行します。



[編集]画面が表示されます。
この画面所の右上の「フロッピーディスクのアイコン」を選択します。



「名前をつけて保存」ダイアログが表示されるので、任意の場所と名前を指定します。

以上で、プロジェクトの作成は完了です。

4. 編集

4.1. ニューラルネットワーク

次に、実際に学習で使用するニューラルネットワークを構築します。
今回は、サンプルプロジェクト「01_logistic_regression」のニューラルネットワークをベースに、一部修正をしたニューラルネットワークを使用します。
(コピペ可能!)
変更する内容は、[Affine]の[Output]プロパティです。
このプロパティの値を、「1」から「10」に変更します。



今回は、「画像が0~9のどの数値なのか?」が「0/1」で表現された結果を出力します。
そのため、10個の値を出力するように値を設定します。
それ以外の値は変更せず、そのまま使用します。

4.2. データセットの指定

次に、学習/評価で使用するデータセットを指定します。

[編集]画面右上にある[データセット]を選択します。



学習と評価で使用するデータセットを指定する画面が表示されます。
まずは、学習で使用するデータセットを指定します。
データセットの指定は、以下の手順で実施します。

  1. 画面左ペインで「Training」を選択します。
  2. 画面左中央部辺りの「URI:」をクリック
    (現在使用可能なデータセットが一覧表示される)
  3. 表示されたデータセットの中から、データセットのNNCへの登録で登録したデータを選択



評価用のデータセットも、同じ手順で登録します。
手順としては、上述の「Training」を指定していた場所を、「Validation」に変更するだけです。

5. 実行

ここまでで準備が整ったので、次は実際に学習と評価を実施します。

5.1. 学習の実行

学習の実施手順は、前回のエントリで書いた内容と同じです。
そのため、今回は詳細は省略します。

学習が完了すると、以下のような画面になります。



5.2. 評価の実行と結果の確認

次に、学習結果に対する評価を実施します。
評価の手順も学習同様、前回のエントリで書いた内容と同じです。
そのため、やっぱり省略します。

評価が完了すると、画面の表示は以下のようになっています。



この画面を見ても分かるように、「2」の画像が「2」、「1」の画像が「1」、「0」の画像が「0」として認識されていることが分かります。
また、画面を右側にスクロールさせ、「7」と「4」の結果を見ると、コチラも正しく認識されていることが分かります。



このように、各画像の数字が正しく判定されていることが分かります。

5.3. 評価の実行と結果の確認(詳細)

NNCの画面上では表示範囲が限定されてしまい、全ての結果の確認は困難です。
ところでこの評価結果は、csv形式でファイルに出力されています。
学習完了後に「評価」タブを開くと、実施した評価の一覧が表示されます。
その一覧の中の任意の結果を選択し右クリック、「学習結果のフォルダを開く」を選択します。



エクスプローラが表示され、「output_result.csv」という名前のファイルが含まれています。
このファイルが、評価結果の全データになります。
エクセルなどで開くことで、より詳細な評価結果が確認できます。



6. まとめ

今回は、MNISTが公開している数字の「0」から「9」まで画像データを、それぞれNNC上で構築したニューラルネットワークで学習、評価させた場合に正しく判定できるか確認をしてみました。
使用したニューラルネットワークは、サンプルで提供されているモノを少し変更しただけです。
しかしそれでも、画像の数字が適切に判定できていました。
このことから、数字の画像データから、そこに記載された数値を判定するニューラルネットワークをNNCで構築できることが分かりました。

また今回のエントリにおいて、NNCの使い方にも少しずつですが慣れてきました。
NNCで作成したモデルは、pythonやC言語で使用できるデータとして抽出できるようです。
次は、実際にアプリケーションでのモデルの使用に挑戦してみたいと思います。

ではっ!