🤖

NeuralNetwork on Scratch

2022/05/13に公開約2,400字

NeuralNetwork on Scratch

コミュニティ「自由研究室 AIRS-Lab」の企画で「Scratchで何か作る」というのがあって、自分らしいものを…と考えてたらニューラルネットワークしかないなと思ったので作ってみました。せっかくなら、手書き(文字)認識できた方が面白いと思ったので自分で書いたものを学習/認識させられるようにしてみました。実用性やらなにやらは脇に置いてます。↓こんな感じ。

https://youtu.be/MSkAOL8Pavk

https://scratch.mit.edu/projects/690096830

特徴

  • 拡張機能は「ペン」しか使っていません。
  • キャンバスエリアに書いたものを学習、認識することができます。
  • 手書きの訓練データはデータ登録時にデータ拡張(ぼかす、ずらす)されます。
  • 手書きのデータは 14x14=196 のサイズ(MNISTの半分のサイズ)で扱われます。
  • 読み取りの定義(スキャン)を変更することで、MNISTに準じた特徴量(28x28=784)で読み取ることも可能です。
  • ハイパーパラメータは任意に設定することができます。
  • 隠れ層のユニット数は任意に設定することができます。
  • 隠れ層の活性化関数は ReLU, LeakyReLU から選べます。別の活性化関数の実装も可能です。
  • 隠れ層の層を増やすことができます。(やり方はこちらの記事を参照)
  • 出力層の活性化関数は Softmax を実装しています。
  • 損失関数は クロスエントロピー誤差 を実装しています。
  • ミニバッチに対応しています。
  • Irisデータセットなどの外部データも読み込めます。(やり方はこちらの記事を参照)

  • 手書きデータの学習には少し時間がかかります…学習がうまく進まない場合はやり直しましょう。
  • 認識精度はそれほど高くないと思います。
  • ホールドアウト法とかクロスバリデーションなんかは考えてません。 ><

使い方

データの登録

  1. 「ペン」を押して手書きモードにします。
  2. キャンバスエリア(左上の枠に囲まれた部分)に図形や文字などを書きます。
  3. [訓練データ登録]ボタンを押します。
  4. ラベル(書いたものが何か)を入力します。
  5. 2~4を繰り返してデータを増やします。データの種類は3つ程度、1種類につき3パターン程度が一つの目安です。あまりデータ数が多いと学習にめちゃ時間がかかります。。

※ データを登録するとそのデータをぼかしたもの(1パターン)、上下左右にずらしたもの(4パターン)も自動的に生成されて拡張データとして登録されます。拡張データは登録したデータのリスト(regist_datas)とは別のリストで管理されています。

学習

  1. 必要に応じてハイパーパラメータ、隠れ層の活性化関数を設定します。
  2. 必要に応じて隠れ層のユニット数を設定します。(出力層のユニット数は登録データ(のラベルの種類数)に応じて自動で設定されます。)
  3. [初期化]ボタンを押すと特徴量の数を取得し、重みとバイアスの値が初期化されます。
  4. [学習開始]ボタンを押し、バッチサイズを入力すると学習が開始されます。
  5. 学習が終了するまで気長に待ちましょう。(loss がうまく下がらない場合はやり直しましょう。)
  6. loss が min_loss を下回るか、epoch数が max_epoch を超えると学習を終了させます。

性能評価

  1. [モデルの性能評価]を押すと登録データ(regist_datas)に対して推論を行い、正解率を計算します。

テスト(推論)

  1. 「ペン」をクリックして手書きモードにします。
  2. キャンバスエリアに認識させたい図形や文字を書きます。
  3. [テスト(推論)]ボタン(左側真ん中より少し上の緑のボタンです。動画では[推論]となっています。)を押すと推論結果が表示されます。正しく認識されましたでしょうか。

訓練データの削除

  1. [訓練データ削除]をクリックすると登録されているデータがすべて削除されます。

その他

[推論 読み込みデータ]ボタンと 「ノートPC」のスプライトは外部データの学習で使用します。これについては↓で説明しています。

https://zenn.dev/fuji_t/articles/f616de5627642a

※[推論 読み込みデータ]ボタンの機能は[テスト(推論)]ボタンに統一しました。

謝辞

Teba@高専受験さんの「Scratchで拡張機能などを一切使わずにニューラルネットワークを作ってみた【スクラッチ】」には大いに刺激を受けました。この記事がなければ Scratch での手書き認識に挑戦しようとは思わなかったかもしれません。


【関連記事】

https://zenn.dev/fuji_t/articles/f616de5627642a

https://zenn.dev/fuji_t/articles/c292e6eb1d84a7

Discussion

ログインするとコメントできます