Pybrainでニューラルネットワーク

Python3、ニューラルネットワークで機械学習する。
ニューラルネットワーク自体は古い手法だが仕組みは簡単なので、ざっとした手元検証用。

1. インストール
ニューラルネットワークでメジャーなPybrainをインストール。

pip3だとpython2対応のpybrainになるため、gitからコピーしてインストールする。

$ git clone git://github.com/pybrain/pybrain.git
$ cd pybrain
$ python3 setup.py install

あとは公式のdocに従って下記の通り進める。

# 公式ドキュメントがpythonコマンドを使っているところはpython3を使用する。

2-a. シンプルな方法でバックプロパゲーション

xor問題を説く。

from pybrain.tools.shortcuts import buildNetwork
from pybrain.structure import LinearLayer, SigmoidLayer, TanhLayer, SoftmaxLayer, BiasUnit
from pybrain.datasets import SupervisedDataSet
from pybrain.supervised.trainers import BackpropTrainer

# 入力ユニット2、隠れユニット2、出力ユニット1、隠れと出力にバイアス入力有り。
nn = buildNetwork(2, 2, 1, bias=True)
# 訓練データ
ds = SupervisedDataSet(2, 1)
ds.addSample((0, 0), (0, ))
ds.addSample((0, 1), (1, ))
ds.addSample((1, 0), (1, ))
ds.addSample((1, 1), (0, ))
# バックプロパゲーションをセット。学習係数と安定化係数を設定。
trainer = BackpropTrainer(nn, ds, learningrate = 0.75, momentum = 0.10)
# 1,000回繰り返し訓練
trainer.trainEpochs(1000)
# 結果出力
print(nn.activateOnDataset(ds))

結果は以下で、正しくパターン認識できている。

[[ 0.]
 [ 1.]
 [ 1.]
 [ 0.]]

 

2-b. 柔軟な方法でバックプロパケーション

ユニットの接続などを柔軟に行える方法で、2-aと同じネットワークを作る。

from pybrain.structure import FeedForwardNetwork
from pybrain.structure import LinearLayer, SigmoidLayer, SoftmaxLayer, BiasUnit
from pybrain.structure import FullConnection
from pybrain.datasets import SupervisedDataSet
from pybrain.supervised.trainers import BackpropTrainer

# ベースとなるフィードフォワードネットワークを作成
nn = FeedForwardNetwork()
# 入力、バイアス、隠れ、出力レイヤーを作成
input = LinearLayer(2)
bias = BiasUnit()
hidden = SigmoidLayer(2)
output = SigmoidLayer(1)
# ネットワークにレイヤーを追加。
nn.addInputModule(input)
nn.addModule(bias)
nn.addModule(hidden)
nn.addOutputModule(output)
# レイヤーを接続。バイアスは隠れ層と出力層両方に接続。
nn.addConnection(FullConnection(input, hidden))
nn.addConnection(FullConnection(bias, hidden))
nn.addConnection(FullConnection(hidden, output))
nn.addConnection(FullConnection(bias, output))
# 学習前の準備
nn.sortModules()
# 学習データの作成
ds = SupervisedDataSet(2, 1)
ds.addSample((0, 0), (0, ))
ds.addSample((0, 1), (1, ))
ds.addSample((1, 0), (1, ))
ds.addSample((1, 1), (0, ))
# 学習
trainer = BackpropTrainer(nn, ds, learningrate = 0.75, momentum = 0.10)
trainer.trainEpochs(1000)
# テスト
print(nn.activateOnDataset(ds))

結果は2-aと同様。

 

参考