未分類

chainerで多層パーセプトロンを作って、3桁の足し算をさせてみた

今回は人工知能のお勉強として、Tensorflowからchainerに戻って、多層パーセプトロンを作る。
で、そいつに3桁の足し算をさせてみようと。

でもって、お勉強した後には問題を出して、解けるかどうかチャレンジしてみようと。

使用環境
ubuntu14.04
python2.7
chainer 1.17.0

まず、インポートは定番もので下記を参照。
モデル保存用にserializersもインポート。

[py]

import numpy as np
import chainer.functions as F
import chainer.links as L
from chainer import Variable, optimizers, Chain, serializers


[/py]

xと教師ラベルのtには下記を代入する。

[py]

x=Variable(np.array([[422,232],[165,499],[777,305],[480,392]],dtype=np.float32))
t=Variable(np.array([[654],[664],[1082],[872]],dtype=np.float32))


[/py]

今回は多層パーセプトロンを作るのだが、多層といってもまず2層で実行してみる。

[py]

class TasouModel(Chain):
    def __init__(self):
        super(TasouModel, self).__init__(
            l1=L.Linear(2,3),
            l2=L.Linear(3,1),
       
        )
        


    def __call__(self,x):
        h = self.l1(x)
        h2=self.l2(h)
        return h2



[/py]

で、モデルを読み込んで、
最適化はAdamを採用。

[py]

model = TasouModel()
optimizer = optimizers.Adam()
optimizer.setup(model)



[/py]

5000回学習させて、
誤差を出して、逆伝播。
パラメータ値を更新して、
誤差とyのデータを確認する。

ちなみに、誤差が減っていく様子を眺めるのは心地いい。

[py]

for i in range(5000):
    model.zerograds()
    y=model(x)
    loss=F.mean_squared_error(y, t)
    loss.backward()
    optimizer.update()
    
    print "loss",loss.data

print "y.data",y.data



[/py]

ここまでで問題無ければ、最後にテストで正解を出せるか確認する。

[py]

xt=Variable(np.array([[639,256]],dtype=np.float32))
yt=model(xt)

print "yt.data",yt.data


[/py]

で、実行した結果がこれ。


loss 0.00546533148736
loss 0.00546533148736
loss 0.00546533148736
loss 0.00546533148736
loss 0.00546533148736
y.data [[ 654.13433838]
[ 663.99200439]
[ 1081.94458008]
[ 871.97393799]]
yt.data [[ 895.03637695]]

y.dataがお勉強させていく過程での計算結果。
lossの値が減っているので、当然y.dataも正解になる。

yt.dataがお勉強した数字とは別の値でテストした結果。
出題は639と253を足せってことなので、895は正解。

コードを実際に動かしてみて、正解値が出なければ、もっとお勉強させてみましょう。
10000回とか30000回とか、お好みでどうぞ。

例、下記のカッコの中を変えればいい。
for i in range(10000): //10000回の時

さて、こんな感じで多層パーセプトロンのお勉強をしてみた。
多層パーセプトロン=深層学習(ディープラーニング)なので、その仕組みの基礎がなんとなく理解できたでしょう。

後は、この層をもっと深く重ねていけば、まさしく深層になっていくってこと。

人間が何かを学ぶには、まずシンプルにすれば良し。
全てを削ぎとって、簡潔なコードを学習し、少しずつコードを増やしていく。

深層学習(ディープラーニング)はこのことを教えてくれるんですなあ。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です