Chainer:ニューラルネットワークのモデルの基本


2017年 02月 06日

元々のプログラムはIrisのデータ用になっていて、そのデータに対して3層のニューラルネットワーク(NN)でDeep Learning をし、学習結果をテストするようになっていた。
このとき、次のような図をイメージするのだ。
この図は、
R for Deep Learning (I): Build Fully Connected Neural Network from Scratch
からのものだ。
あ、これはPythonではなく、RでNNをやる説明のようだ。まあいいか、言語なんて大差ない。

図にはデータの流れが示されていないが、データは左から入り、右に向いて流れていく。
3つの層を構成するノードはタテに並んだ丸で示され、左から、入力層、中間層、出力層になっている。

iris_network.png
この図を、次の『Chainerによる実践深層学習』のIrisのプログラムのうち、上の図に対応した部分だけを示す。

class IrisChain(Chain):
def __init__(self):
super(IrisChain, self).__init__(
l1=L.Linear(4,6),
l2=L.Linear(6,3),
)

def __call__(self,x,y):
return F.mean_squared_error(self.fwd(x), y)

def fwd(self,x):
h1 = F.sigmoid(self.l1(x))
h2 = self.l2(h1)
return h2

このうち、今注目すべきは、以下の部分だけである。
            l1=L.Linear(4,6),              # 入力層→中間層
l2=L.Linear(6,3),              # 中間層→出力層

数字が、上の図ときちんと対応しているのが分かるだろう。

入力層の4は、データが4種の値から構成されているからである。

中間層の6は、まあ適当に決めて良いのだが、詳しい説明は面倒なので省略する。

出力層の3は、Irisでは3種類の種の分類(クラス分け)をしたいので、3になっている。


ここまで理解したら、前回説明した8×8のめちゃくちゃ粗い手書き数字データの分類に挑戦してみよう。
ということで、次回につづく。