機械学習に挑戦(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. データセットの指定
次に、学習/評価で使用するデータセットを指定します。
[編集]画面右上にある[データセット]を選択します。
学習と評価で使用するデータセットを指定する画面が表示されます。
まずは、学習で使用するデータセットを指定します。
データセットの指定は、以下の手順で実施します。
- 画面左ペインで「Training」を選択します。
- 画面左中央部辺りの「URI:」をクリック
(現在使用可能なデータセットが一覧表示される) - 表示されたデータセットの中から、データセットの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言語で使用できるデータとして抽出できるようです。
次は、実際にアプリケーションでのモデルの使用に挑戦してみたいと思います。
ではっ!
ディスカッション
コメント一覧
まだ、コメントがありません