(第4回)1ケタの足し算を機械学習で計算
1ケタの足し算は、暗算でもできますが、機械学習で実行すると、機械学習の理解が深まると思いますのでやってみたいと思います。
まずは、どのようにするか?ですが、数値で足し算をするためにどのように教師データをつくるか?を検討しました。
確実に学習させるため、入力を『0~9』+『0~9』とし、出力を『0~18』とします。つまり、入力に20個の箱と、出力に19個の箱があれば良いことになります。
実際は、出力は20個にします。
そこで、入力と出力の次元数を20にし、第1層・第2層の次元数を100にして、モデルを作ることにします。

モデルの構造
<構造>
以下の構造のニューラルネットワークの構造で、入力と出力に箱を20個づつ用意するので、次元数は20個にします。第1層と第2層は、100次元にしました。

0.学習データの準備
エクセルで学習用のデータを作ります。1ケタの足し算をさせます。入力(2つの数字)と出力(答え)のそれぞれを箱に入れるイメージです。
以下の図で計算をさせていますが、それぞれの数値を箱にいれるための元データですが、機械学習には使いません。入力用の20個の箱の前半が1つめの数値
後半の10個が2つめの数値になります。
出力用の20個の数値は、0~18=19個で、その場所の箱の数値を1にします。20個目の箱は1になりません。
入力・出力の両方とも、数値は0が1番目、1が2番目というように順番に入れます。

エクセルのデータは7万行準備します。最初の6万行は、学習用。残りの1万行は、評価用となります。
入力用と出力用はデータを分けて、それぞれをファイルにします
学習用ファイル(Pythonの圧縮ZIPにも含まれています)
- xtrain.csv・・・・入力側の教師データ 6万
- xtest.csv・・・・・入力側の評価用データ 1万
- ttrain.csv・・・・出力側の教師データ 6万
- ttest.csv・・・・・出力側の評価用データ 1万
1.Pythonで学習する
準備したデータをPythonで学習をします。
学習は上記のCSVを読み込んで、学習させます。モデルのパラメーターは次のとおりです
- #モデル作成とパラメータ設定
- network = TwoLayerNet(input_size=20, hidden_size=100, output_size=20)
- iters_num = 10000 # 繰り返しの回数を適宜設定する
- train_size = x_train_data.shape[0]
- batch_size = 100
- learning_rate = 0.5
学習データはファイルに出力させて、再利用が可能にします。
学習を実行すると4つのファイルが出力されるのですが、1層目のwとb、2層目のwとbとなっています。
学習はすぐ終わります。
「Data_Import.py」
2.Pythonで学習データを使って計算をする
学習データは4つのファイルになっているので、それを読み込んで計算させます。
計算するときは、入力の箱に2つの数値と一致する箇所を1にします
例えば、次のように2+1の場合ですが、
- # < Number1 >< Number2 >
- # [0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9])
- myimg_array=np.array([0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0])
とします。
以下を実行することで計算が開始され。一番最後に『3』と表示されますが、2+1=3という意味になります。
「CheckAns2.py」
計算した結果は、以下の図のとおりです。一番大きい数値「8.31325366e-01」が4番目にないます。これは、「3」を意味します。

Pytonファイル
この一連のファイルは以下のリンクにあります。ダウンロードして、『学習』→『計算』をさせると正しいことがよくわかります。
1ケタの足し算という簡単な計算ですが、機械学習をさせてみると大変なことがわかります。
学習させるデータの数を減らすと、少しずつ特徴がなくなっていき、最後には、正解ができなくなります。
10,000~1,000の学習回数にすると1,000は答えが「4」になります。仕事で『機械学習やる!』という意気込みだけで、データを揃えないで
学習回数を減らして機械学習すると間違える良い例だと思います。
子供に勉強を教えるとき、たくさん繰り返す(学習する量が多い)=テストの点数がよくなるが、機械学習でも言えるのでしょうね・・・。

以下のファイルをダウンロードしてマクロを有効にすると確認できます。
Python.zip
*)保存して解凍して実行してください
-------------
