Scratchで応用情報技術者試験問3（令和元年秋期：ニューラルネットワーク）をプログラム

#Scratchで応用情報技術者試験問3（令和元年秋期：ニューラルネットワーク)をプログラム

令和元年秋期の応用情報技術者試験問3では、ニューラルネットワークがテーマとして出題されました。本題では、初歩であるパーセプトロンについの問題でした。私自身ディープラーニングの知識はあまりないのですが、今後の勉強に繋げたいと思います。

[IPAの過去問は、こちらです。](https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2019h31.html#01aki)
https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2019h31.html#01aki



[Scratchでは、こちらで公開しています。](https://scratch.mit.edu/projects/380609416)
https://scratch.mit.edu/projects/380609416


##1. 単純パーセプトロンを用いた論理演算


###1-1. 使用する定数、変数及び配列
* NI：入力ノードの数を表す定数。今回は2入力で、2となる。
* NC：論理演算の入力値の全ての組み合わせを表す定数。今回は4となる。
* X：論理演算の入力値の全ての組合せを表す2次元配列。[[0,0],[0,1],[1,0],[1,1]]が設定されている。
* Y：論理演算の出力値（演算結果）を格納する1次元配列。
* WY：ノードyのアークがもつ重みの値を表す1次元配列。
* BY：ノードyのバイアスの値を表す変数。


####1-1-1. 配列X（2次元配列）の用意

Scratchは、2次元配列は使用できないので、リスト（1次元）を2次元配列のようにしています。
![MakeListX.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606075/d93a4ac3-f208-d1e6-aa36-5c1f78ed6633.png)

####1-1-2. 配列Y（1次元配列）の用意

![MakeListY.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606075/472d68f6-931b-df27-bbcc-0739dde49503.png)

####1-1-3. 配列WY（1次元配列）の用意


論理積（AND）、論理和（OR）、排他的論理和（XOR：3層パーセプトロンで使う）では、[0.5, 0.5]を与えます。

![MakeListWY.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606075/47905232-716e-8ad9-557d-27e78aa62b24.png)

否定論理積（XOR）では[-0.5, -0.5]を与えます。

![MakeListWY2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606075/7266de99-ef16-7af0-cb8c-2f4d07f05239.png)

----------------------------------------------------------------------------
###1-2. プログラムsimple_perceptron
単純パーセプトロンのプログラムです。
![f_simple_perceptron.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606075/22e0690d-c90b-ce87-e4e8-33d0d72abb0f.png)

----------------------------------------------------------------------------
###1-2-1. 論理積（AND）

ノードyのバイアスの値BYとして、-0.7を与えています。

![論理積実行.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606075/e358c7e1-064e-5323-9166-355f27280c6a.png)


###実行結果

![論理積実行結果.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606075/a7ddb005-33c8-bff7-4bcc-f88902a4fe04.png)

----------------------------------------------------------------------------
###1-2-2. 論理和（OR）

ノードyのバイアスの値BYとして、-0.2を与えています。

![論理和実行.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606075/68a850e2-0f33-b8ce-fe6d-ed738bc8fe79.png)


###実行結果

![論理和実行結果.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606075/3a5e6550-b74f-0e0e-18ac-e4eec384d8a2.png)

----------------------------------------------------------------------------
###1-2-3. 否定論理積（NAND）

ノードyのバイアスの値BYとして、0.7を与えています。

![否定論理積実行.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606075/68adf5b5-473a-6529-357c-782b836779a8.png)


###実行結果

![否定論理積実行結果.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606075/285eac24-f190-32e7-1a08-fcd9c9fb9bde.png)

----------------------------------------------------------------------------
##2. 3層パーセプトロンを用いた論理演算

###2-1. 使用する定数、変数及び配列
単純パーセプトロンを用いた論理演算にて使用したものに加えて、以下のものを使用します。
###
* NM：中間ノードの数を表す定数。今回、中間ノードの数は二つなので、2となる。
* M：中間ノードの演算結果を格納する2次元配列。
* WM：中間ノードのアークがもつ重みの値を表す2次元配列。
* BM：中間ノードのバイアス値を入れる1次元配列。


####2-1-1. 配列M（2次元配列）の用意
Scratchでは2次元配列は使用できないので、以下のようにしました。（配列Xとは異なる方法です）

先ず、空の1次元リストを作成します。

![MakeListM.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606075/3576f3f2-9670-0395-c6e6-28c3d63676f2.png)

配列Mへの出し入れは以下の
（おーはしさんという方の、[Scratchで二次元配列を使う方法](https://scratch-de-asobo.blogspot.com/2016/06/two-dimensional-array.html#more)という記事を参考に作成しています。）

![Mへの出し入れ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606075/097a86dd-890b-2c5d-f043-00fd93cc5f4e.png)

----------------------------------------------------------------------------
####2-1-2. 配列WM（2次元配列）の用意
Scratchは、2次元配列は使用できないので、以下のようにしました。（配列X、配列Mとは異なる方法を試してみました。）

![MakeListWM.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606075/49182553-3336-d57c-de2b-316fd5fefc3b.png)


配列WMからの値の取り出しは、以下のようにしています。
![WM取り出し.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606075/c192b775-c9ca-a2cb-e179-ef420adad93f.png)

----------------------------------------------------------------------------
####2-1-3. 配列BM（1次元配列）の用意
中間のノードのバイアス値として、排他的論理和では、[-0.2, 0.7]を与えています。

![MakeListBM.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606075/d375e43a-a684-ee60-eded-205fb588724f.png)


----------------------------------------------------------------------------
###2-2. プログラムthree_layer_perceptron
3層パーセプトロンのプログラムです。

![f_three_layer_perceptron.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606075/4cfed495-1a0d-0c3a-bc94-401013765de6.png)

----------------------------------------------------------------------------
###2-2-1. 排他的論理和（XOR）

ノードyのバイアスの値BYとして、-0.6を与えています。

![排他的論理和実行.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606075/1a24fa1d-13b5-f9ef-384b-d79b417ffe74.png)


###実行結果
ちゃんと、動いています。
![排他的論理和実行結果.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606075/59e21a77-0d24-47c4-3022-bf766ee0e0de.png)


----------------------------------------------------------------------------
Scratchは子ども向けのものですが、情報技術者試験にもつながる良いツールだと思います。