🌺

NeuralNetwork on Scratch(アヤメの分類)

2022/05/15に公開

前回の記事はこちら。
https://zenn.dev/fuji_t/articles/44f3113e0a14ae

NeuralNetwork on Scratch(アヤメの分類)

https://youtu.be/fNhRP6LJC_M

前回は手書きの学習/認識を紹介しましたが、「NeuralNetwork on Scratch」は外部のデータを読み込んで学習させることもできます。今回は「アヤメの分類」をやってみましょう。

データの準備

Scratch のリスト型変数に カンマ区切りのデータ(csv)を読み込ませようとすると、読み込ませる列を聞かれてしまいます。特徴量とラベルを一気に読み込ませたいので、カンマ区切りでないデータ(ファイル)に加工しましょう。ここでは、カンマ(,)をコロン(:)に置換して、コロン区切りの状態にしています。

1行目には項目名を入れてください。これは「推論」のテストを行う際に使用されます。
また、1列目にラベルが来るようにし、特徴量は2列目以降としてください。
他のデータセットでもこのような構造にすれば、訓練データとして正しく読み込ませることができます。

データに日本語文字列が含まれる場合はファイルの文字コードにも注意してください。(utf-8にしておけば大丈夫かと思います。)
拡張子は .csv のままにしておきましょう。comma が colon になっちゃいましたが、どっちも c で始まるから結局のところ「csv」ですし(w

データの読み込み

右下のノートパソコンのスプライト([モデルの性能評価]ボタンの右側、スプライト名は「ユーティリティ」)をクリックすると、「import_datas」リストが表示されます。(もう一度クリックすると非表示になります。)「import_datas」に以前のデータが入っている場合は、「ユーティリティ」スプライトの「import_datasのすべてを削除する」を実行するとすべて削除されます。

「import_datas」リストで右クリックして「読み込み」で上記で作ったファイルを読み込ませてください。

データの登録

データを読み込んだら、「ユーティリティ」スプライトの「外部データを取り込む」ブロックを実行しましょう。「regist_datas」に特徴量、「regist_datas_label」にラベルが振り分けられます。振り分けが完了すると「import_datas」リストは非表示になります。

パラメータの設定

「学習機」スプライトの[初期化]ボタンを押すと特徴量と出力層のユニット数(ラベルが何種類あるか)が取得されるので、それに合わせてパラメータを設定します。パラメータの設定は「初期化」ブロックで各変数の値を設定することで行います。

以下の変数の設定をするとよいでしょう。

  • G_隠れ層1の数 … 隠れ層1層目のユニット数
  • G_隠れ層nの数 … 出力層の手前の層(ここでは隠れ層の2層目)のユニット数
  • G_隠れ層_活性化関数 … 隠れ層の活性化関数。「ReLU」か「LeakyReLU」をお好みで。
  • min_loss … 学習終了の目安とする loss の最小値。loss がこの値を下回ると学習を終了します。
  • G_学習率 … 学習率です。0.01 とか 0.1 とか。
  • max_epoch … 学習終了の目安とする epoch 数の最大値。epoch 数がこの値を上回ると学習を終了します。

※ バッチサイズは学習開始時に設定するのでここで設定する必要はありません。

学習

[学習開始]ボタンを押してバッチサイズを入力すると学習が開始されます。学習開始時にパラメータの初期化も行われるので、学習開始前に[初期化]ボタンを押す必要はありません。

loss が min_loss を下回るか、epoch数が max_epoch を超えると学習が終了します。

性能評価

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

テスト(推論)

学習が終了したらテストをしてみましょう。
[推論 読込データ](左の真ん中より少し上あたりにある水色のボタンです) [テスト(推論)](左の真ん中より少し上あたりにある緑色のボタンです)をクリックするとデータの特徴量を順番に聞かれるので、テストしたいデータの特徴量を入力していきましょう。特徴量の入力が終わると推論結果が表示されます。正解しているとよいですね。

最後に

「データの準備」で書いたフォーマットでファイルを作れば自分でデータを用意することもできます。いろいろなデータで試してみてもよいかもしれませんね。

また、上の説明ではカンマをコロンに置換してましたが、別の記号(文字)にすることもできます。その場合、「ユーティリティ」スプライトの「外部データを取り込む」ブロック内の「項目ごとに分ける」の「デリミタ」引数に渡す値をその記号(文字)にすれば正しくデータを登録することができます。

Scratch のプロジェクトと使用したデータ

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

https://www.dropbox.com/s/9on2fxqjfpkz8wf/iris_dataset_2-nn_on_scratch.csv?dl=0


【関連記事】

https://zenn.dev/fuji_t/articles/44f3113e0a14ae

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

https://zenn.dev/fuji_t/articles/97032fd2eb11ad


【Scratchプロジェクト】

NeuralNetwork_on_Scratch_2 (全部入り)
https://scratch.mit.edu/projects/690096830

Base_NeuralNetwork_on_Scratch_2 (基本部分のみ)
https://scratch.mit.edu/projects/694599958/

Discussion