🤖
NeuralNetwork on Scratch
NeuralNetwork on Scratch
コミュニティ「自由研究室 AIRS-Lab」の企画で「Scratchで何か作る」というのがあって、自分らしいものを…と考えてたらニューラルネットワークしかないなと思ったので作ってみました。せっかくなら、手書き(文字)認識できた方が面白いと思ったので自分で書いたものを学習/認識させられるようにしてみました。実用性やらなにやらは脇に置いてます。↓こんな感じ。
特徴
- 拡張機能は「ペン」しか使っていません。
- キャンバスエリアに書いたものを学習、認識することができます。
- 手書きの訓練データはデータ登録時にデータ拡張(ぼかす、ずらす)されます。
- 手書きのデータは 14x14=196 のサイズ(MNISTの半分のサイズ)で扱われます。
- 読み取りの定義(スキャン)を変更することで、MNISTに準じた特徴量(28x28=784)で読み取ることも可能です。
- ハイパーパラメータは任意に設定することができます。
- 隠れ層のユニット数は任意に設定することができます。
- 隠れ層の活性化関数は ReLU, LeakyReLU から選べます。別の活性化関数の実装も可能です。
- 隠れ層の層を増やすことができます。(やり方はこちらの記事を参照)
- 出力層の活性化関数は Softmax を実装しています。
- 損失関数は クロスエントロピー誤差 を実装しています。
- ミニバッチに対応しています。
- Irisデータセットなどの外部データも読み込めます。(やり方はこちらの記事を参照)
- 手書きデータの学習には少し時間がかかります…学習がうまく進まない場合はやり直しましょう。
- 認識精度はそれほど高くないと思います。
- ホールドアウト法とかクロスバリデーションなんかは考えてません。 ><
使い方
データの登録
- 「ペン」を押して手書きモードにします。
- キャンバスエリア(左上の枠に囲まれた部分)に図形や文字などを書きます。
- [訓練データ登録]ボタンを押します。
- ラベル(書いたものが何か)を入力します。
- 2~4を繰り返してデータを増やします。データの種類は3つ程度、1種類につき3パターン程度が一つの目安です。あまりデータ数が多いと学習にめちゃ時間がかかります。。
※ データを登録するとそのデータをぼかしたもの(1パターン)、上下左右にずらしたもの(4パターン)も自動的に生成されて拡張データとして登録されます。拡張データは登録したデータのリスト(regist_datas)とは別のリストで管理されています。
学習
- 必要に応じてハイパーパラメータ、隠れ層の活性化関数を設定します。
- 必要に応じて隠れ層のユニット数を設定します。(出力層のユニット数は登録データ(のラベルの種類数)に応じて自動で設定されます。)
- [初期化]ボタンを押すと特徴量の数を取得し、重みとバイアスの値が初期化されます。
- [学習開始]ボタンを押し、バッチサイズを入力すると学習が開始されます。
- 学習が終了するまで気長に待ちましょう。(loss がうまく下がらない場合はやり直しましょう。)
- loss が min_loss を下回るか、epoch数が max_epoch を超えると学習を終了させます。
性能評価
- [モデルの性能評価]を押すと登録データ(regist_datas)に対して推論を行い、正解率を計算します。
テスト(推論)
- 「ペン」をクリックして手書きモードにします。
- キャンバスエリアに認識させたい図形や文字を書きます。
- [テスト(推論)]ボタン(左側真ん中より少し上の緑のボタンです。動画では[推論]となっています。)を押すと推論結果が表示されます。正しく認識されましたでしょうか。
訓練データの削除
- [訓練データ削除]をクリックすると登録されているデータがすべて削除されます。
その他
[推論 読み込みデータ]ボタンと 「ノートPC」のスプライトは外部データの学習で使用します。これについては↓で説明しています。
※[推論 読み込みデータ]ボタンの機能は[テスト(推論)]ボタンに統一しました。
謝辞
Teba@高専受験さんの「Scratchで拡張機能などを一切使わずにニューラルネットワークを作ってみた【スクラッチ】」には大いに刺激を受けました。この記事がなければ Scratch での手書き認識に挑戦しようとは思わなかったかもしれません。
【関連記事】
【Scratchプロジェクト】
NeuralNetwork_on_Scratch_2 (全部入り)
Base_NeuralNetwork_on_Scratch_2 (基本部分のみ)
Discussion