【ライブラリ無し】Scratch3.0でニューラルネットワークを作ってみた!
はじめに
認識精度90%超え!
今回は、Scratch3.0というビジュアルプログラミング言語でニューラルネットワークを作ってみたので、仕組みなどを共有していきます。
作品はこちらから遊べます↓
前書き
Scratch上で定義したシグモイド関数
ZennってScratch3.0の記事が少ないですよね。Scratch言語からでも学べることはたくさんあると思うので、今後は積極的に記事を共有していきます。
目指せZenn内Scratch情報最多٩( ᐛ )و
取り組み
普段はCoderDojo春日のチャンピオン、プログラミング、ブログなどをやっています。
興味がある方はぜひ!
それでは、早速作品について解説していこうと思います。
※CoderDojoはボランティアなので、参加無料です!
この作品の性能
ニューラルネットワーク本体のプログラムはたったこれだけ!
- 入力層が784個、1つ目の隠れ層が50個、2つ目の層が100個、出力層が10個
- 28*28の画像データの入力
- 0~9の十種類の出力
- レイヤー数、ニューロン数を増減可能
- 入力や隠れ層、出力数も自由自在に変更可能
- NumPyを参考にした行列演算プログラムの自作
- 簡単に行列演算
- 二次元の行列に対応
- MNISTの手書き数字データを90%以上で認識可能
- Pythonで作ったプログラムと大差ない精度
- 自分で書いた文字も認識可能
- ただ、データをMNISTに寄せてないので低精度
- 1秒もかからず推論可能
- 恐ろしい数の重みやバイアスを計算していますが、意外と高速に推論してくれます
- まだ学習は不可能
- 誤差逆伝播法などのアルゴリズムが最近理解できたので、作成予定
以上のような感じです。そこそこいい感じの性能ではないでしょうか。まだ学習は不可能なのですが、つい最近誤差逆伝播法などの仕組みが理解できたので、今後作ると思います。
ただ、Scratchで作るとなると、色々と工夫が大切です。例えば、
- クラスや継承がない
- クローンの個数は300までが限界
- 配列は一次元しかない
- 要素数には最大値あり- 多次元の配列を扱うには自作する必要あり
- 関数(定義)は戻り値がない
- グローバル変数に戻り値を入れたりする必要あり
- プログラムが長くなってしまう😫
- 処理が重い
- 色々頑張る💪
他にも紹介したい仕組みやプログラムはあるのですが、長くなってしまうので詳しくは以下の記事にまとめてみました。興味がある方はぜひ読まれてください。
今後の予定
- 勾配降下法、誤差逆伝播法を使って学習させる
- 勾配降下法の試作品
- 誤差逆伝播法の試作品
- 行列の扱いの仕方を考える
- 動的に行列の次元を変えられると便利
- 画像認識以外にも挑戦
- 物体検出
- 自然言語処理
- 画像生成
- ゲームのプレイ
- などなど
- もっとディープなニューラルネットワークを作る
- CNN(畳み込みニューラルネットワーク)
- などなど
今後この作品をもとに、色々な作品を展開していきたいなと思っています。
まず一番最初にやりたいのが誤差逆伝播法などを使った学習です。あとは、CNNなどのニューラルネットワークや、画像認識以外にもチャレンジしてみたいところです。
理論上、Pythonなどで作れるAIはほぼ全て作れそうな気がしています。(ただ、大量のパラメーターを扱うとなると、配列の要素数制限などが痛くなってくるかも…)
まとめ
- Scratch3.0でもPythonとほぼ同等の精度が出せるニューラルネットワークが作れた!
最後に
ここまで読んでいただきありがとうございました!これからもScratchの記事や役に立ちそうな情報をどんどん共有していきたいなと思いますので、ぜひいいねやフォロー等よろしくお願いします。(励みになります)
関連記事
Discussion