※現在、ブログ記事を移行中のため一部表示が崩れる場合がございます。
順次修正対応にあたっておりますので何卒ご了承いただけますよう、お願い致します。

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のめちゃくちゃ粗い手書き数字データの分類に挑戦してみよう。
ということで、次回につづく。