Pybrain-quick-guide

提供:Dev Guides
移動先:案内検索

PyBrain-概要

Pybrainは、Pythonを使用して実装された機械学習用のオープンソースライブラリです。 このライブラリは、ネットワーク、データセット、トレーナー向けの使いやすいトレーニングアルゴリズムを提供し、ネットワークをトレーニングおよびテストします。

公式文書で述べられているPybrainの定義は次のとおりです-

PyBrainは、Python用のモジュール式機械学習ライブラリです。 その目標は、機械学習タスク用の柔軟で使いやすいまだ強力なアルゴリズムと、アルゴリズムをテストおよび比較するためのさまざまな定義済み環境を提供することです。

PyBrainは、Pythonベースの強化学習、人工知能、ニューラルネットワークライブラリの略です。 実際、最初に名前を思いついた後、この非常に記述的な「Backronym」をリバースエンジニアリングしました。

Pybrainの特徴

以下はPybrainの特徴です-

ネットワーク

ネットワークはモジュールで構成され、接続を使用して接続されます。 Pybrainは、フィードフォワードネットワーク、リカレントネットワークなどのニューラルネットワークをサポートしています。

  • フィードフォワードネットワーク*は、ノード間の情報が順方向に移動し、決して逆方向に移動しないニューラルネットワークです。 フィードフォワードネットワークは、人工ニューラルネットワークで利用可能なネットワークの中で最初で最も単純なネットワークです。

情報は、入力ノードから、非表示ノードの隣に、さらに出力ノードに渡されます。

  • リカレントネットワーク*は、フィードフォワードネットワークに似ています。唯一の違いは、各ステップでデータを記憶する必要があることです。 各ステップの履歴を保存する必要があります。

データセット

データセットは、ネットワーク上でテスト、検証、トレーニングするために提供されるデータです。 使用するデータセットのタイプは、機械学習で実行するタスクによって異なります。 Pybrainがサポートする最も一般的に使用されるデータセットは、 SupervisedDataSet および ClassificationDataSet です。

*SupervisedDataSet* - *_input_* および *_target_* のフィールドで構成されます。 これはデータセットの最も単純な形式であり、主に教師付き学習タスクに使用されます。
*ClassificationDataSet* -主に分類の問題に対処するために使用されます。 *_input _* 、 *_ target_* フィールドと、指定されたターゲットの自動バックアップである「クラス」と呼ばれる追加フィールドを取ります。 たとえば、出力は1または0であるか、指定された入力に基づいた値で出力がグループ化されます。つまり、特定のクラスに分類されます。

トレーナー

ネットワーク、つまりニューラルネットワークを作成すると、与えられたトレーニングデータに基づいてトレーニングされます。 ネットワークが適切にトレーニングされているかどうかは、そのネットワークでテストされたテストデータの予測に依存します。 Pybrain Trainingで最も重要な概念は、BackpropTrainerとTrainUntilConvergenceの使用です。

*BackpropTrainer* -エラーを逆伝播することにより(時間をかけて)教師付きまたはClassificationDataSetデータセット(潜在的にシーケンシャル)に従ってモジュールのパラメーターをトレーニングするトレーナーです。
*TrainUntilConvergence* -収束するまでデータセットでモジュールをトレーニングするために使用されます。

道具

Pybrainは、パッケージをインポートしてネットワークを構築するのに役立つツールモジュールを提供しています: pybrain.tools.shortcuts.buildNetwork

可視化

pybrainを使用してテストデータを視覚化することはできません。 しかし、PybrainはMathplotlibやpyplotなどの他のフレームワークと連携してデータを視覚化できます。

Pybrainの利点

Pybrainの利点は-

  • Pybrainは、機械学習を学習するためのオープンソースの無料ライブラリです。 これは、機械学習に興味のある初心者にとっては良いスタートです。
  • Pybrainはpythonを使用して実装しているため、Java/C ++などの言語と比較して開発が高速になります。
  • Pybrainは、Pythonの他のライブラリと簡単に連携してデータを視覚化します。
  • Pybrainは、フィードフォワードネットワーク、リカレントネットワーク、ニューラルネットワークなどの一般的なネットワークをサポートしています。
  • .csvを使用してデータセットを読み込むことは、Pybrainでは非常に簡単です。 また、別のライブラリのデータセットを使用できます。 *Pybrainトレーナーを使用すると、データのトレーニングとテストが簡単になります。

Pybrainの制限

Pybrainは、直面している問題に対するヘルプをあまり提供しません。* stackoverflow および *Google Group で未回答のクエリがいくつかあります。

Pybrainのワークフロー

Pybrainのドキュメントによると、機械学習の流れは次の図に示されています-

Pybrainのワークフロー

最初に、前処理後にPybrainで使用できる生データがあります。

Pybrainのフローは、トレーニングデータとテストデータに分割されたデータセットから始まります。

  • ネットワークが作成され、データセットとネットワークがトレーナーに提供されます。
  • トレーナーはネットワーク上のデータをトレーニングし、出力をトレーニング可能なエラーと視覚化可能な検証エラーとして分類します。
  • テストされたデータを検証して、出力がトレーニングされたデータと一致するかどうかを確認できます。

用語

機械学習のためにPybrainを使用する際に考慮すべき重要な用語があります。 彼らは次のとおりです-

合計エラー-ネットワークのトレーニング後に表示されるエラーを指します。 エラーが繰り返しごとに変化し続ける場合、繰り返しの間に一定のエラーが表示されるまで、落ち着くまでに時間が必要であることを意味します。 一定のエラー数の表示が開始されると、ネットワークが収束し、追加のトレーニングが適用されるかどうかに関係なく同じままになることを意味します。

訓練されたデータ-Pybrainネットワークを訓練するために使用されるデータです。

テストデータ-それは訓練されたPybrainネットワークをテストするために使用されるデータです。

*Trainer* -ネットワーク、つまりニューラルネットワークを作成すると、与えられたトレーニングデータに基づいてトレーニングされます。 ネットワークが適切にトレーニングされているかどうかは、そのネットワークでテストされたテストデータの予測に依存します。 Pybrain Trainingで最も重要な概念は、BackpropTrainerとTrainUntilConvergenceの使用です。
*BackpropTrainer* -エラーを逆伝播することにより(時間をかけて)教師付きまたはClassificationDataSetデータセット(潜在的にシーケンシャル)に従ってモジュールのパラメーターをトレーニングするトレーナーです。
*TrainUntilConvergence* -データセット上でモジュールが収束するまでトレーニングするために使用されます。

レイヤー-レイヤーは基本的にネットワークの隠されたレイヤーで使用される機能のセットです。

接続-接続はレイヤーと同様に機能します。唯一の違いは、ネットワーク内のあるノードから別のノードにデータをシフトすることです。

モジュール-モジュールは、入力および出力バッファで構成されるネットワークです。

教師あり学習-この場合、入力と出力があり、アルゴリズムを使用して入力と出力をマッピングできます。 アルゴリズムは、与えられたトレーニングデータを学習するために作成され、アルゴリズムが正しいデータを予測すると、反復プロセスが停止します。

監視なし-この場合、入力はありますが、出力はわかりません。 教師なし学習の役割は、与えられたデータで可能な限り訓練を受けることです。

PyBrain-環境設定

この章では、PyBrainのインストールに取り組みます。 PyBrainでの作業を開始するには、最初にPythonをインストールする必要があります。 だから私たちは次のことに取り組むつもりです-

  • Pythonをインストールする
  • PyBrainをインストールする

Pythonをインストールする

Pythonをインストールするには、以下のPython公式サイトhttps://www.python.org/downloads/[www.python.org/downloads]にアクセスして、Windows、Linux/Unix、macOSで利用可能な最新バージョンをクリックします。 。 使用可能な64ビットまたは32ビットOSごとにPythonをダウンロードします。

Pythonのインストール

ダウンロードしたら、*。exe *ファイルをクリックし、手順に従ってシステムにpythonをインストールします。

セットアップの進行状況

Pythonパッケージマネージャー、つまりpipも、上記のインストールでデフォルトでインストールされます。 システムでグローバルに動作させるには、Pythonの場所をPATH変数に直接追加します。インストールの開始時に同じものが表示され、[パスに追加]というチェックボックスを忘れずにチェックします。 チェックを忘れた場合は、以下の手順に従ってPATHに追加してください。

PATHに追加

PATHに追加するには、以下の手順に従ってください-

  • コンピューターアイコンを右クリックし、プロパティ→システムの詳細設定をクリックします。
  • 以下の画面が表示されます

システムのプロパティ

  • 上記の環境変数をクリックします。 以下の画面が表示されます

環境変数

[パス]を選択し、[編集]ボタンをクリックして、最後にPythonのロケーションパスを追加します。 次に、Pythonバージョンを確認します。

Pythonバージョンの確認

以下のコードは、Pythonのバージョンを確認するのに役立ちます-

E:\pybrain>python --version
Python 3.7.3

PyBrainのインストール

Pythonをインストールしたので、Pybrainをインストールします。 以下に示すように、pybrainリポジトリを複製します-

git clone git://github.com/pybrain/pybrain.git
C:\pybrain>git clone git://github.com/pybrain/pybrain.git
Cloning into 'pybrain'...
remote: Enumerating objects: 2, done.
remote: Counting objects: 100% (2/2), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 12177 (delta 0), reused 0 (delta 0), pack-reused 12175
Receiving objects: 100% (12177/12177), 13.29 MiB | 510.00 KiB/s, done.
Resolving deltas: 100% (8506/8506), done.

cd pybrain を実行し、次のコマンドを実行します-

python setup.py install

このコマンドは、システムにpybrainをインストールします。

完了したら、pybrainがインストールされているかどうかを確認するには、コマンドラインプロンプトを開き、以下に示すようにPythonインタープリターを起動します-

C:\pybrain\pybrain>python
Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 22:22:05) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>

以下のコードを使用してインポートpybrainを追加できます-

>>> import pybrain
>>>

インポートpybrainがエラーなしで機能する場合、pybrainが正常にインストールされていることを意味します。 これで、pybrainでの作業を開始するコードを作成できます。

PyBrain-PyBrainネットワークの紹介

PyBrainは、Pythonによる機械学習用に開発されたライブラリです。 機械学習にはいくつかの重要な概念があり、その1つがネットワークです。 ネットワークはモジュールで構成され、接続を使用して接続されます。

単純なニューラルネットワークのレイアウトは次のとおりです-

シンプルニューラルネットワーク

Pybrainは、フィードフォワードネットワーク、リカレントネットワークなどのニューラルネットワークをサポートしています。

  • フィードフォワードネットワーク*は、ノード間の情報が順方向に移動し、決して逆方向に移動しないニューラルネットワークです。 フィードフォワードネットワークは、人工ニューラルネットワークで利用可能なネットワークの中で最初で最も単純なネットワークです。 情報は、入力ノードから、非表示ノードの隣に、さらに出力ノードに渡されます。

簡単なフィードフォワードネットワークレイアウトを次に示します。

フィードフォワードネットワーク

円はモジュールと呼ばれ、矢印の付いた線はモジュールへの接続です。

ノード ABC および D は入力ノードです

*H1* 、 *H2* 、 *H3* 、 *H4* は非表示ノードであり、Oは出力です。

上記のネットワークでは、4つの入力ノード、4つの隠れ層、1つの出力があります。 図に示されている線の数は、トレーニング中に調整されるモデル内の重みパラメーターを示しています。

  • リカレントネットワーク*はフィードフォワードネットワークに似ていますが、各ステップでデータを記憶する必要があるという唯一の違いがあります。 各ステップの履歴を保存する必要があります。

リカレントネットワークのシンプルなレイアウトを次に示します-

リカレントネットワーク

PyBrain-ネットワークでの作業

ネットワークはモジュールで構成され、モジュールは接続を使用して接続されます。 この章では、次のことを学びます-

  • ネットワークを作成
  • ネットワークの分析

ネットワークを作成する

pythonインタープリターを使用してコードを実行します。 pybrainでネットワークを作成するには、以下に示すように buildNetwork apiを使用する必要があります-

C:\pybrain\pybrain>python
Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 22:22:05) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>>
>>> from pybrain.tools.shortcuts import buildNetwork
>>> network = buildNetwork(2, 3, 1)
>>>

buildNetwork()を使用してネットワークを作成しました。パラメーターは2、3、1です。つまり、ネットワークは2つの入力、3つの非表示、1つの出力で構成されています。

以下は、ネットワークの詳細、つまりモジュールと接続です-

C:\pybrain\pybrain>python
Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 22:22:05) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from pybrain.tools.shortcuts import buildNetwork
>>> network = buildNetwork(2,3,1)
>>> print(network)
FeedForwardNetwork-8
   Modules:
   [<BiasUnit 'bias'>, <LinearLayer 'in'>, <SigmoidLayer 'hidden0'>,
<LinearLay er 'out'>]
   Connections:
   [<FullConnection 'FullConnection-4': 'hidden0' -> 'out'>, <FullConnection 'F
ullConnection-5': 'in' -> 'hidden0'>, <FullConnection 'FullConnection-6': 'bias'
-< 'out'>, <FullConnection 'FullConnection-7': 'bias' -> 'hidden0'>]
>>>

モジュールはレイヤーで構成され、接続はFullConnectionオブジェクトから作成されます。 したがって、各モジュールと接続には、上記のように名前が付けられます。

分析ネットワーク

次のように名前を参照することにより、モジュール層と接続に個別にアクセスできます-

>>> network['bias']
<BiasUnit 'bias'>
>>> network['in']
<LinearLayer 'in'>

PyBrain-データセットの操作

データセットは、ネットワークをテスト、検証、トレーニングするために提供される入力データです。 使用するデータセットのタイプは、機械学習で実行するタスクによって異なります。 この章では、以下を見ていきます-

  • データセットの作成
  • データセットへのデータの追加

最初に、データセットを作成し、指定された入力でデータセットをテストする方法を学びます。

データセットの作成

データセットを作成するには、pybrainデータセットパッケージを使用する必要があります: pybrain.datasets

Pybrainは、 _ SupervisedDataset ' 、SequentialDataset、ClassificationDataSetなどのデータセットクラスをサポートしています。 _SupervisedDataset' を使用して、データセットを作成します。使用するデータセットは、ユーザーが実装しようとしている機械学習タスクに依存します。

*_SupervisedDataset dataset_* には、params入力とターゲットが必要です。 以下に示すように、XORの真理値表を考慮してください-
A B A XOR B
0 0 0
0 1 1
1 0 1
1 1 0

与えられる入力は2次元配列のようなもので、1つの出力が得られます。 したがって、ここで入力はサイズになり、ターゲットは1になります。 したがって、データセットの入力は2,1になります。

createdataset.py

from pybrain.datasets import SupervisedDataSet
sds = SupervisedDataSet(2, 1)
print(sds)

これは、上記のコードpython createdataset.pyを実行したときに得られるものです-

C:\pybrain\pybrain\src>python createdataset.py
input: dim(0, 2)
[]
target: dim(0, 1)
[]

上記のように、サイズ2の入力とサイズ1のターゲットが表示されます。

データセットへのデータの追加

サンプルデータをデータセットに追加しましょう。

createdataset.py

from pybrain.datasets import SupervisedDataSet
sds = SupervisedDataSet(2, 1)
xorModel = [
   [(0,0), (0,)],
   [(0,1), (1,)],
   [(1,0), (1,)],
   [(1,1), (0,)],
]
for input, target in xorModel:
sds.addSample(input, target)
print("Input is:")
print(sds['input'])
print("\nTarget is:")
print(sds['target'])

以下に示すように、XORModel配列を作成しました-

xorModel = [
   [(0,0), (0,)],
   [(0,1), (1,)],
   [(1,0), (1,)],
   [(1,1), (0,)],
]

データセットにデータを追加するには、入力とターゲットを取得するaddSample()メソッドを使用します。

addSampleにデータを追加するには、以下に示すようにxorModel配列をループします-

for input, target in xorModel:
   sds.addSample(input, target)

実行後、次の出力が得られます-

python createdataset.py

C:\pybrain\pybrain\src>python createdataset.py
Input is:
[[Target is:
[[You can get the input and target details from the dataset created by simply using the input and target index as shown below −

[source,result,notranslate]

print(sds ['input'])print(sds ['target'])

PyBrain-データセットの種類

データセットは、ネットワークでテスト、検証、トレーニングするために提供されるデータです。 使用するデータセットのタイプは、機械学習で実行するタスクによって異なります。 この章では、さまざまなデータセットタイプについて説明します。

私たちは、次のパッケージを追加することにより、データセットを扱うことができます-

pybrain.dataset

SupervisedDataSet

SupervisedDataSetは、 _ input_ および target のフィールドで構成されています。 これはデータセットの最も単純な形式であり、主に教師付き学習タスクに使用されます。

以下は、コードでそれを使用する方法です-

from pybrain.datasets import SupervisedDataSet

SupervisedDataSetで利用可能なメソッドは次のとおりです-

addSample(inp、target)

このメソッドは、入力とターゲットの新しいサンプルを追加します。

splitWithProportion(proportion = 0.10)

これにより、データセットが2つの部分に分割されます。 最初の部分には、入力として指定されたデータセットの%があります。つまり、入力が.10の場合、データセットの10%とデータの90%です。 あなたの選択に従って割合を決めることができます。 分割されたデータセットは、ネットワークのテストとトレーニングに使用できます。

  • copy()*-データセットのディープコピーを返します。
  • clear()*-データセットをクリアします。

saveToFile(ファイル名、フォーマット=なし、** kwargs)

ファイル名で指定されたファイルにオブジェクトを保存します。

以下は、SupervisedDatasetを使用した実際の例です-

*testnetwork.py*
from pybrain.tools.shortcuts import buildNetwork
from pybrain.structure import TanhLayer
from pybrain.datasets import SupervisedDataSet
from pybrain.supervised.trainers import BackpropTrainer

# Create a network with two inputs, three hidden, and one output
nn = buildNetwork(2, 3, 1, bias=True, hiddenclass=TanhLayer)

# Create a dataset that matches network input and output sizes:
norgate = SupervisedDataSet(2, 1)

# Create a dataset to be used for testing.
nortrain = SupervisedDataSet(2, 1)

# Add input and target values to dataset
# Values for NOR truth table
norgate.addSample((0, 0), (1,))
norgate.addSample((0, 1), (0,))
norgate.addSample((1, 0), (0,))
norgate.addSample((1, 1), (0,))

# Add input and target values to dataset
# Values for NOR truth table
nortrain.addSample((0, 0), (1,))
nortrain.addSample((0, 1), (0,))
nortrain.addSample((1, 0), (0,))
nortrain.addSample((1, 1), (0,))

#Training the network with dataset norgate.
trainer = BackpropTrainer(nn, norgate)

# will run the loop 1000 times to train it.
for epoch in range(1000):
   trainer.train()
trainer.testOnData(dataset=nortrain, verbose = True)

出力

上記のプログラムの出力は次のとおりです-

*python testnetwork.py*
C:\pybrain\pybrain\src>python testnetwork.py
Testing on data:
('out: ', '[0.887 ]')
('correct:', '[1 ]')
error: 0.00637334
('out: ', '[0.149 ]')
('correct:', '[0 ]')
error: 0.01110338
('out: ', '[0.102 ]')
('correct:', '[0 ]')
error: 0.00522736
('out: ', '[-0.163]')
('correct:', '[0 ]')
error: 0.01328650
('All errors:', [0.006373344564625953, 0.01110338071737218, 0.005227359234093431
, 0.01328649974219942])
('Average error:', 0.008997646064572746)
('Max error:', 0.01328649974219942, 'Median error:', 0.01110338071737218)

ClassificationDataSet

このデータセットは、主に分類の問題に対処するために使用されます。 入力、ターゲットフィールド、および指定されたターゲットの自動バックアップである「クラス」と呼ばれる追加フィールドを取ります。 たとえば、出力は1または0であるか、指定された入力に基づいて出力とともにグループ化されます。つまり、特定の1つのクラスに分類されます。

コードでそれを使用する方法は次のとおりです-

from pybrain.datasets import ClassificationDataSet
Syntax
//ClassificationDataSet(inp, target=1, nb_classes=0, class_labels=None)

ClassificationDataSetで利用可能なメソッドは次のとおりです-

*_addSample(inp、target)_* -このメソッドは、入力とターゲットの新しいサンプルを追加します。
*_splitByClass()_* -このメソッドは2つの新しいデータセットを提供します。最初のデータセットにはクラスが選択され(0..nClasses-1)、2番目のデータセットには残りのサンプルがあります。
*__ convertToOneOfMany()_* -このメソッドは、ターゲットクラスを1-of-k表現に変換し、古いターゲットをフィールドクラスとして保持します
*ClassificationDataSet* の実際の例を次に示します。

from sklearn import datasets
import matplotlib.pyplot as plt
from pybrain.datasets import ClassificationDataSet
from pybrain.utilities import percentError
from pybrain.tools.shortcuts import buildNetwork
from pybrain.supervised.trainers import BackpropTrainer
from pybrain.structure.modules import SoftmaxLayer
from numpy import ravel
digits = datasets.load_digits()
X, y = digits.data, digits.target
ds = ClassificationDataSet(64, 1, nb_classes=10)

for i in range(len(X)):
ds.addSample(ravel(X[i]), y[i])
test_data_temp, training_data_temp = ds.splitWithProportion(0.25)
test_data = ClassificationDataSet(64, 1, nb_classes=10)

for n in range(0, test_data_temp.getLength()):
test_data.addSample( test_data_temp.getSample(n)[0], test_data_temp.getSample(n)[1] )
training_data = ClassificationDataSet(64, 1, nb_classes=10)

for n in range(0, training_data_temp.getLength()):
training_data.addSample( training_data_temp.getSample(n)[0], training_data_temp.getSample(n)[1] )
test_data._convertToOneOfMany()
training_data._convertToOneOfMany()
net = buildNetwork(training_data.indim, 64, training_data.outdim, outclass=SoftmaxLayer)
trainer = BackpropTrainer(
   net, dataset=training_data, momentum=0.1,learningrate=0.01,verbose=True,weightdecay=0.01
)
trnerr,valerr = trainer.trainUntilConvergence(dataset=training_data,maxEpochs=10)
plt.plot(trnerr,'b',valerr,'r')
plt.show()
trainer.trainEpochs(10)
print('Percent Error on testData:',percentError(trainer.testOnClassData(dataset=test_data), test_data['class']))

上記の例で使用されるデータセットは数字のデータセットであり、クラスは0〜9であるため、10のクラスがあります。 入力は64、ターゲットは1、クラスは10です。

このコードは、データセットを使用してネットワークをトレーニングし、トレーニングエラーと検証エラーのグラフを出力します。 また、次のようなテストデータのパーセント誤差を示します-

出力

Classification DataSet。

Total error: 0.0432857814358
Total error: 0.0222276374185
Total error: 0.0149012052174
Total error: 0.011876985318
Total error: 0.00939854792853
Total error: 0.00782202445183
Total error: 0.00714707652044
Total error: 0.00606068893793
Total error: 0.00544257958975
Total error: 0.00463929281336
Total error: 0.00441275665294
('train-errors:', '[0.043286 , 0.022228 , 0.014901 , 0.011877 , 0.009399 , 0.007
   822 , 0.007147 , 0.006061 , 0.005443 , 0.004639 , 0.004413 ]')
('valid-errors:', '[0.074296 , 0.027332 , 0.016461 , 0.014298 , 0.012129 , 0.009
   248 , 0.008922 , 0.007917 , 0.006547 , 0.005883 , 0.006572 , 0.005811 ]')
Percent Error on testData: 3.34075723830735

PyBrain-データセットのデータのインポート

この章では、Pybrainデータセットでデータを動作させる方法を学びます。

最も一般的に使用されるのはデータセットです-

  • sklearnを使用する
  • CSVファイルから

sklearnを使用する

sklearnを使用する

sklearnからのデータセットの詳細を含むリンクは次のとおりです:https://scikit-learn.org/stable/datasets/indexl

sklearnのデータセットを使用する方法の例をいくつか示します-

例1:load_digits()

from sklearn import datasets
from pybrain.datasets import ClassificationDataSet
digits = datasets.load_digits()
X, y = digits.data, digits.target
ds = ClassificationDataSet(64, 1, nb_classes=10)
for i in range(len(X)):
ds.addSample(ravel(X[i]), y[i])

例2:load_iris()

from sklearn import datasets
from pybrain.datasets import ClassificationDataSet
digits = datasets.load_iris()
X, y = digits.data, digits.target
ds = ClassificationDataSet(4, 1, nb_classes=3)
for i in range(len(X)):
ds.addSample(X[i], y[i])

CSVファイルから

また、次のようにcsvファイルからのデータを使用することができます-

xor真理値表のサンプルデータを次に示します。datasettest.csv

CSVファイル

データセットの.csvファイルからデータを読み取るための作業例を次に示します。

from pybrain.tools.shortcuts import buildNetwork
from pybrain.structure import TanhLayer
from pybrain.datasets import SupervisedDataSet
from pybrain.supervised.trainers import BackpropTrainer
import pandas as pd

print('Read data...')
df = pd.read_csv('data/datasettest.csv',header=0).head(1000)
data = df.values

train_output = data[:,0]
train_data = data[:,1:]

print(train_output)
print(train_data)

# Create a network with two inputs, three hidden, and one output
nn = buildNetwork(2, 3, 1, bias=True, hiddenclass=TanhLayer)

# Create a dataset that matches network input and output sizes:
_gate = SupervisedDataSet(2, 1)

# Create a dataset to be used for testing.
nortrain = SupervisedDataSet(2, 1)

# Add input and target values to dataset
# Values for NOR truth table
for i in range(0, len(train_output)) :
   _gate.addSample(train_data[i], train_output[i])

#Training the network with dataset norgate.
trainer = BackpropTrainer(nn, _gate)

# will run the loop 1000 times to train it.
for epoch in range(1000):
   trainer.train()
trainer.testOnData(dataset=_gate, verbose = True)

例に示すように、パンダを使用してcsvファイルからデータを読み取ります。

出力

C:\pybrain\pybrain\src>python testcsv.py
Read data...
[0 1 1 0]
[
   [0 0]
   [0 1]
   [1 0]
   [1 1]
]
Testing on data:
('out: ', '[0.004 ]')
('correct:', '[0 ]')
error: 0.00000795
('out: ', '[0.997 ]')
('correct:', '[1 ]')
error: 0.00000380
('out: ', '[0.996 ]')
('correct:', '[1 ]')
error: 0.00000826
('out: ', '[0.004 ]')
('correct:', '[0 ]')
error: 0.00000829
('All errors:', [7.94733477723902e-06, 3.798267582566822e-06, 8.260969076585322e
-06, 8.286246525558165e-06])
('Average error:', 7.073204490487332e-06)
('Max error:', 8.286246525558165e-06, 'Median error:', 8.260969076585322e-06)

PyBrain-ネットワーク上のトレーニングデータセット

これまで、ネットワークとデータセットの作成方法を見てきました。 データセットとネットワークを一緒に使用するには、トレーナーの助けを借りて行う必要があります。

以下は、作成されたネットワークにデータセットを追加し、後でトレーナーを使用してトレーニングおよびテストする方法を確認するための実際の例です。

testnetwork.py

from pybrain.tools.shortcuts import buildNetwork
from pybrain.structure import TanhLayer
from pybrain.datasets import SupervisedDataSet
from pybrain.supervised.trainers import BackpropTrainer

# Create a network with two inputs, three hidden, and one output
nn = buildNetwork(2, 3, 1, bias=True, hiddenclass=TanhLayer)

# Create a dataset that matches network input and output sizes:
norgate = SupervisedDataSet(2, 1)

# Create a dataset to be used for testing.
nortrain = SupervisedDataSet(2, 1)

# Add input and target values to dataset
# Values for NOR truth table
norgate.addSample((0, 0), (1,))
norgate.addSample((0, 1), (0,))
norgate.addSample((1, 0), (0,))
norgate.addSample((1, 1), (0,))

# Add input and target values to dataset
# Values for NOR truth table
nortrain.addSample((0, 0), (1,))
nortrain.addSample((0, 1), (0,))
nortrain.addSample((1, 0), (0,))
nortrain.addSample((1, 1), (0,))

#Training the network with dataset norgate.
trainer = BackpropTrainer(nn, norgate)

# will run the loop 1000 times to train it.
for epoch in range(1000):
trainer.train()
trainer.testOnData(dataset=nortrain, verbose = True)

ネットワークとデータセットをテストするには、BackpropTrainerが必要です。 BackpropTrainerは、エラーを(時間を通して)バックプロパゲーションすることにより、監視対象データセット(潜在的にシーケンシャル)に従ってモジュールのパラメーターをトレーニングするトレーナーです。

クラスの2つのデータセット-SupervisedDataSetを作成しました。 私たちは次のようなNORデータモデルを利用しています-

A B A NOR B
0 0 1
0 1 0
1 0 0
1 1 0

上記のデータモデルは、ネットワークのトレーニングに使用されます。

norgate = SupervisedDataSet(2, 1)
# Add input and target values to dataset
# Values for NOR truth table
norgate.addSample((0, 0), (1,))
norgate.addSample((0, 1), (0,))
norgate.addSample((1, 0), (0,))
norgate.addSample((1, 1), (0,))

以下は、テストに使用されるデータセットです-

# Create a dataset to be used for testing.
nortrain = SupervisedDataSet(2, 1)

# Add input and target values to dataset
# Values for NOR truth table
norgate.addSample((0, 0), (1,))
norgate.addSample((0, 1), (0,))
norgate.addSample((1, 0), (0,))
norgate.addSample((1, 1), (0,))

トレーナーは次のように使用されます-

#Training the network with dataset norgate.
trainer = BackpropTrainer(nn, norgate)

# will run the loop 1000 times to train it.
for epoch in range(1000):
   trainer.train()

データセットでテストするには、以下のコードを使用できます-

trainer.testOnData(dataset=nortrain, verbose = True)

出力

python testnetwork.py

C:\pybrain\pybrain\src>python testnetwork.py
Testing on data:
('out: ', '[0.887 ]')
('correct:', '[1 ]')
error: 0.00637334
('out: ', '[0.149 ]')
('correct:', '[0 ]')
error: 0.01110338
('out: ', '[0.102 ]')
('correct:', '[0 ]')
error: 0.00522736
('out: ', '[-0.163]')
('correct:', '[0 ]')
error: 0.01328650
('All errors:', [0.006373344564625953, 0.01110338071737218, 0.005227359234093431
, 0.01328649974219942])
('Average error:', 0.008997646064572746)
('Max error:', 0.01328649974219942, 'Median error:', 0.01110338071737218)

出力を確認すると、テストデータは提供されたデータセットとほぼ一致するため、エラーは0.008です。

ここで、テストデータを変更し、平均誤差を見てみましょう。 以下に示すように、出力を変更しました-

以下は、テストに使用されるデータセットです-

# Create a dataset to be used for testing.
nortrain = SupervisedDataSet(2, 1)

# Add input and target values to dataset
# Values for NOR truth table
norgate.addSample((0, 0), (0,))
norgate.addSample((0, 1), (1,))
norgate.addSample((1, 0), (1,))
norgate.addSample((1, 1), (0,))

それではテストしてみましょう。

出力

python testnework.py

C:\pybrain\pybrain\src>python testnetwork.py
Testing on data:
('out: ', '[0.988 ]')
('correct:', '[0 ]')
error: 0.48842978
('out: ', '[0.027 ]')
('correct:', '[1 ]')
error: 0.47382097
('out: ', '[0.021 ]')
('correct:', '[1 ]')
error: 0.47876379
('out: ', '[-0.04 ]')
('correct:', '[0 ]')
error: 0.00079160
('All errors:', [0.4884297811030845, 0.47382096780393873, 0.47876378995939756, 0
.0007915982149002194])
('Average error:', 0.3604515342703303)
('Max error:', 0.4884297811030845, 'Median error:', 0.47876378995939756)

エラーは0.36と表示されます。これは、テストデータが訓練されたネットワークと完全に一致していないことを示しています。

PyBrain-テストネットワーク

この章では、データをトレーニングし、トレーニングしたデータのエラーをテストする例をいくつか見ていきます。

私たちはトレーナーを利用するつもりです-

BackpropTrainer

BackpropTrainerは、エラーを(時間を通して)バックプロパゲーションすることにより、教師付きまたはClassificationDataSetデータセット(潜在的にシーケンシャル)に従ってモジュールのパラメーターをトレーニングするトレーナーです。

TrainUntilConvergence

収束するまで、データセットでモジュールをトレーニングするために使用されます。

ニューラルネットワークを作成すると、与えられたトレーニングデータに基づいてトレーニングされますが、ネットワークが適切にトレーニングされているかどうかは、そのネットワークでテストされたテストデータの予測に依存します。

ニューラルネットワークを構築し、トレーニングエラー、テストエラー、検証エラーを予測する実際の例を順を追って見てみましょう。

ネットワークをテストする

以下は、ネットワークをテストするために従う手順です-

  • 必要なPyBrainおよびその他のパッケージのインポート
  • ClassificationDataSetを作成する
  • データセットをテストデータとして25%、トレーニング済みデータとして75%に分割
  • TestDataとトレーニングデータをClassificationDataSetに変換して戻す
  • ニューラルネットワークの作成
  • ネットワークのトレーニング
  • エラーと検証データの視覚化
  • テストデータエラーの割合

ステップ1

必要なPyBrainおよびその他のパッケージをインポートします。

必要なパッケージは、以下に示すようにインポートされます-

from sklearn import datasets
import matplotlib.pyplot as plt
from pybrain.datasets import ClassificationDataSet
from pybrain.utilities import percentError
from pybrain.tools.shortcuts import buildNetwork
from pybrain.supervised.trainers import BackpropTrainer
from pybrain.structure.modules import SoftmaxLayer
from numpy import ravel

ステップ2

次のステップは、ClassificationDataSetを作成することです。

データセットの場合、以下に示すように、sklearnデータセットのデータセットを使用します-

以下のリンクでsklearnのload_digitsデータセットを参照してください-

https://scikit-learn.org/stable/modules/generated/sklearn.datasets.load_digitsl#sklearn.datasets.load_digits

digits = datasets.load_digits()
X, y = digits.data, digits.target

ds = ClassificationDataSet(64, 1, nb_classes=10)
# we are having inputs are 64 dim array and since the digits are from 0-9 the
classes considered is 10.

for i in range(len(X)):
   ds.addSample(ravel(X[i]), y[i]) # adding sample to datasets
  • ステップ3 *

データセットをテストデータとして25%、トレーニング済みデータとして75%に分割-

test_data_temp, training_data_temp = ds.splitWithProportion(0.25)

そのため、ここでは、値が0.25のsplitWithProportion()というデータセットのメソッドを使用しました。これは、データセットをテストデータとして25%、トレーニングデータとして75%に分割します。

  • ステップ4 *

TestdataとトレーニングデータをClassificationDataSetに変換します。

test_data = ClassificationDataSet(64, 1, nb_classes=10)
for n in range(0, test_data_temp.getLength()):
   test_data.addSample( test_data_temp.getSample(n)[0], test_data_temp.getSample(n)[1] )
training_data = ClassificationDataSet(64, 1, nb_classes=10)

for n in range(0, training_data_temp.getLength()):

training_data.addSample(
   training_data_temp.getSample(n)[0], training_data_temp.getSample(n)[1]
)
test_data._convertToOneOfMany()
training_data._convertToOneOfMany()

データセットでsplitWithProportion()メソッドを使用すると、データセットがsuperviseddatasetに変換されるため、上記の手順に示すように、データセットを再度classificationdatasetに変換します。

  • ステップ5 *

次のステップは、ニューラルネットワークの作成です。

net = buildNetwork(training_data.indim, 64, training_data.outdim, outclass=SoftmaxLayer)

入力と出力がトレーニングデータから使用されるネットワークを作成しています。

  • ステップ6 *

ネットワークのトレーニング

今、重要な部分は、以下に示すように、データセット上のネットワークを訓練することです-

trainer = BackpropTrainer(net, dataset=training_data,
momentum=0.1,learningrate=0.01,verbose=True,weightdecay=0.01)

BackpropTrainer()メソッドを使用し、作成されたネットワーク上のデータセットを使用しています。

  • ステップ7 *

次のステップは、エラーの可視化とデータの検証です。

trnerr,valerr = trainer.trainUntilConvergence(dataset=training_data,maxEpochs=10)
plt.plot(trnerr,'b',valerr,'r')
plt.show()

エポック10で収束するトレーニングデータでtrainUntilConvergenceというメソッドを使用します。 以下に示すようにプロットしたトレーニングエラーと検証エラーを返します。 青い線はトレーニングエラーを示し、赤い線は検証エラーを示します。

トレーニングデータ

上記のコードの実行中に受信した合計エラーは以下に示されています-

Total error: 0.0432857814358
Total error: 0.0222276374185
Total error: 0.0149012052174
Total error: 0.011876985318
Total error: 0.00939854792853
Total error: 0.00782202445183
Total error: 0.00714707652044
Total error: 0.00606068893793
Total error: 0.00544257958975
Total error: 0.00463929281336
Total error: 0.00441275665294
('train-errors:', '[0.043286 , 0.022228 , 0.014901 , 0.011877 , 0.009399 , 0.007
822 , 0.007147 , 0.006061 , 0.005443 , 0.004639 , 0.004413 ]')
('valid-errors:', '[0.074296 , 0.027332 , 0.016461 , 0.014298 , 0.012129 , 0.009
248 , 0.008922 , 0.007917 , 0.006547 , 0.005883 , 0.006572 , 0.005811 ]')

エラーは0.04から始まり、エポックごとに低下します。つまり、ネットワークはトレーニングされ、エポックごとに改善されます。

  • ステップ8 *

テストデータエラーの割合

以下に示すpercentErrorメソッドを使用して、パーセントエラーを確認できます-

print('Percent Error on
   testData:',percentError(trainer.testOnClassData(dataset=test_data),
   test_data['class']))
  • testDataのエラー率*-3.​​34075723830735

エラーの割合、つまり3.34%を取得しています。これは、ニューラルネットワークの精度が97%であることを意味します。

以下は完全なコードです-

from sklearn import datasets
import matplotlib.pyplot as plt
from pybrain.datasets import ClassificationDataSet
from pybrain.utilities import percentError
from pybrain.tools.shortcuts import buildNetwork
from pybrain.supervised.trainers import BackpropTrainer
from pybrain.structure.modules import SoftmaxLayer
from numpy import ravel
digits = datasets.load_digits()
X, y = digits.data, digits.target

ds = ClassificationDataSet(64, 1, nb_classes=10)

for i in range(len(X)):
   ds.addSample(ravel(X[i]), y[i])

test_data_temp, training_data_temp = ds.splitWithProportion(0.25)
test_data = ClassificationDataSet(64, 1, nb_classes=10)
for n in range(0, test_data_temp.getLength()):
   test_data.addSample( test_data_temp.getSample(n)[0], test_data_temp.getSample(n)[1] )
training_data = ClassificationDataSet(64, 1, nb_classes=10)

for n in range(0, training_data_temp.getLength()):
   training_data.addSample(
      training_data_temp.getSample(n)[0], training_data_temp.getSample(n)[1]
   )
test_data._convertToOneOfMany()
training_data._convertToOneOfMany()

net = buildNetwork(training_data.indim, 64, training_data.outdim, outclass=SoftmaxLayer)
trainer = BackpropTrainer(
   net, dataset=training_data, momentum=0.1,
   learningrate=0.01,verbose=True,weightdecay=0.01
)
trnerr,valerr = trainer.trainUntilConvergence(dataset=training_data,maxEpochs=10)
plt.plot(trnerr,'b',valerr,'r')
plt.show()

trainer.trainEpochs(10)
print('Percent Error on testData:',percentError(
   trainer.testOnClassData(dataset=test_data), test_data['class']
))

PyBrain-フィードフォワードネットワークの使用

フィードフォワードネットワークは、ノード間の情報が順方向に移動し、決して逆方向に移動しないニューラルネットワークです。 フィードフォワードネットワークは、人工ニューラルネットワークで利用可能なネットワークの中で最初で最も単純なネットワークです。 情報は、入力ノードから、非表示ノードの隣に、さらに出力ノードに渡されます。

この章では、次の方法について説明します-

  • フィードフォワードネットワークを作成する
  • 接続とモジュールをFFNに追加する

フィードフォワードネットワークの作成

選択したpython IDE、つまりPyCharmを使用できます。 これでは、Visual Studio Codeを使用してコードを記述し、ターミナルで同じものを実行します。

フィードフォワードネットワークを作成するには、以下に示すように pybrain.structure からインポートする必要があります-

ffn.py

from pybrain.structure import FeedForwardNetwork
network = FeedForwardNetwork()
print(network)

以下に示すようにffn.pyを実行します-

C:\pybrain\pybrain\src>python ffn.py
FeedForwardNetwork-0
Modules:
[]
Connections:
[]

フィードフォワードネットワークにモジュールと接続を追加していません。 したがって、ネットワークには、モジュールと接続の空の配列が表示されます。

モジュールと接続の追加

まず、入力、非表示、出力の各レイヤーを作成し、以下に示すようにモジュールに追加します-

ffy.py

from pybrain.structure import FeedForwardNetwork
from pybrain.structure import LinearLayer, SigmoidLayer
network = FeedForwardNetwork()

#creating layer for input => 2 , hidden=> 3 and output=>1
inputLayer = LinearLayer(2)
hiddenLayer = SigmoidLayer(3)
outputLayer = LinearLayer(1)

#adding the layer to feedforward network
network.addInputModule(inputLayer)
network.addModule(hiddenLayer)
network.addOutputModule(outputLayer)

print(network)

出力

C:\pybrain\pybrain\src>python ffn.py
FeedForwardNetwork-3
Modules:
[]
Connections:
[]

モジュールと接続は空のままです。 以下に示すように作成されたモジュールへの接続を提供する必要があります-

以下に、入力層、非表示層、出力層の間に接続を作成し、ネットワークに接続を追加するコードを示します。

ffy.py

from pybrain.structure import FeedForwardNetwork
from pybrain.structure import LinearLayer, SigmoidLayer
from pybrain.structure import FullConnection
network = FeedForwardNetwork()

#creating layer for input => 2 , hidden=> 3 and output=>1
inputLayer = LinearLayer(2)
hiddenLayer = SigmoidLayer(3)
outputLayer = LinearLayer(1)

#adding the layer to feedforward network
network.addInputModule(inputLayer)
network.addModule(hiddenLayer)
network.addOutputModule(outputLayer)

#Create connection between input ,hidden and output
input_to_hidden = FullConnection(inputLayer, hiddenLayer)
hidden_to_output = FullConnection(hiddenLayer, outputLayer)

#add connection to the network
network.addConnection(input_to_hidden)
network.addConnection(hidden_to_output)

print(network)

出力

C:\pybrain\pybrain\src>python ffn.py
FeedForwardNetwork-3
Modules:
[]
Connections:
[]

まだモジュールと接続を取得できません。 ここで最終ステップを追加しましょう。つまり、以下に示すようにsortModules()メソッドを追加する必要があります-

ffy.py

from pybrain.structure import FeedForwardNetwork
from pybrain.structure import LinearLayer, SigmoidLayer
from pybrain.structure import FullConnection
network = FeedForwardNetwork()

#creating layer for input => 2 , hidden=> 3 and output=>1
inputLayer = LinearLayer(2)
hiddenLayer = SigmoidLayer(3)
outputLayer = LinearLayer(1)

#adding the layer to feedforward network
network.addInputModule(inputLayer)
network.addModule(hiddenLayer)
network.addOutputModule(outputLayer)

#Create connection between input ,hidden and output
input_to_hidden = FullConnection(inputLayer, hiddenLayer)
hidden_to_output = FullConnection(hiddenLayer, outputLayer)

#add connection to the network
network.addConnection(input_to_hidden)
network.addConnection(hidden_to_output)
network.sortModules()

print(network)

出力

C:\pybrain\pybrain\src>python ffn.py
FeedForwardNetwork-6
Modules:
[<LinearLayer 'LinearLayer-3'gt;, <SigmoidLayer 'SigmoidLayer-7'>,
   <LinearLayer 'LinearLayer-8'>]
Connections:
[<FullConnection 'FullConnection-4': 'SigmoidLayer-7' -> 'LinearLayer-8'>,
   <FullConnection 'FullConnection-5': 'LinearLayer-3' -> 'SigmoidLayer-7'>]

これで、feedforwardnetworkのモジュールと接続の詳細を確認できます。

PyBrain-リカレントネットワークでの作業

リカレントネットワークはフィードフォワードネットワークと同じですが、各ステップでデータを覚えておく必要がある点のみが異なります。各ステップの履歴を保存する必要があります。

私たちは方法を学びます-

  • リカレントネットワークを作成する
  • モジュールと接続の追加

リカレントネットワークの作成

リカレントネットワークを作成するには、以下に示すようにRecurrentNetworkクラスを使用します-

rn.py

from pybrain.structure import RecurrentNetwork
recurrentn = RecurrentNetwork()
print(recurrentn)

python rn.py

C:\pybrain\pybrain\src>python rn.py
RecurrentNetwork-0
Modules:
[]
Connections:
[]
Recurrent Connections:
[]

リカレントネットワークのリカレント接続と呼ばれる新しい接続を確認できます。 現在、利用可能なデータはありません。

レイヤーを作成し、モジュールに追加して接続を作成しましょう。

モジュールと接続の追加

レイヤー、つまり入力、非表示、出力を作成します。 レイヤーが入力および出力モジュールに追加されます。 次に、非表示への入力、出力への非表示、および非表示から非表示への繰り返し接続を作成します。

モジュールと接続があるリカレントネットワークのコードは次のとおりです。

rn.py

from pybrain.structure import RecurrentNetwork
from pybrain.structure import LinearLayer, SigmoidLayer
from pybrain.structure import FullConnection
recurrentn = RecurrentNetwork()

#creating layer for input => 2 , hidden=> 3 and output=>1
inputLayer = LinearLayer(2, 'rn_in')
hiddenLayer = SigmoidLayer(3, 'rn_hidden')
outputLayer = LinearLayer(1, 'rn_output')

#adding the layer to feedforward network
recurrentn.addInputModule(inputLayer)
recurrentn.addModule(hiddenLayer)
recurrentn.addOutputModule(outputLayer)

#Create connection between input ,hidden and output
input_to_hidden = FullConnection(inputLayer, hiddenLayer)
hidden_to_output = FullConnection(hiddenLayer, outputLayer)
hidden_to_hidden = FullConnection(hiddenLayer, hiddenLayer)

#add connection to the network
recurrentn.addConnection(input_to_hidden)
recurrentn.addConnection(hidden_to_output)
recurrentn.addRecurrentConnection(hidden_to_hidden)
recurrentn.sortModules()

print(recurrentn)

python rn.py

C:\pybrain\pybrain\src>python rn.py
RecurrentNetwork-6
Modules:
[<LinearLayer 'rn_in'>, <SigmoidLayer 'rn_hidden'>,
   <LinearLayer 'rn_output'>]
Connections:
[<FullConnection 'FullConnection-4': 'rn_hidden' -> 'rn_output'>,
   <FullConnection 'FullConnection-5': 'rn_in' -> 'rn_hidden'>]
Recurrent Connections:
[<FullConnection 'FullConnection-3': 'rn_hidden' -> 'rn_hidden'>]

上記の出力では、モジュール、接続、繰り返し接続を確認できます。

次に示すように、アクティブ化メソッドを使用してネットワークをアクティブ化します-

rn.py

以前に作成したものに以下のコードを追加します-

#activate network using activate() method
act1 = recurrentn.activate((2, 2))
print(act1)

act2 = recurrentn.activate((2, 2))
print(act2)

python rn.py

C:\pybrain\pybrain\src>python rn.py
[-1.24317586]
[-0.54117783]

最適化アルゴリズムを使用したトレーニングネットワーク

pybrainのトレーナーを使用してネットワークをトレーニングする方法を見てきました。 この章では、Pybrainで利用可能な最適化アルゴリズムを使用してネットワークをトレーニングします。

例では、以下に示すようにインポートする必要があるGA最適化アルゴリズムを使用します-

from pybrain.optimization.populationbased.ga import GA

以下は、GA最適化アルゴリズムを使用したトレーニングネットワークの実用例です-

from pybrain.datasets.classification import ClassificationDataSet
from pybrain.optimization.populationbased.ga import GA
from pybrain.tools.shortcuts import buildNetwork

# create XOR dataset
ds = ClassificationDataSet(2)
ds.addSample([0., 0.], [0.])
ds.addSample([0., 1.], [1.])
ds.addSample([1., 0.], [1.])
ds.addSample([1., 1.], [0.])
ds.setField('class', [ [0.],[1.],[1.],[0.]])

net = buildNetwork(2, 3, 1)
ga = GA(ds.evaluateModuleMSE, net, minimize=True)

for i in range(100):
net = ga.learn(0)[0]

print(net.activate([0,0]))
print(net.activate([1,0]))
print(net.activate([0,1]))
print(net.activate([1,1]))

出力

以下に示すように、入力に対するネットワーク上のactivateメソッドは、出力とほぼ一致します-

C:\pybrain\pybrain\src>python example15.py
[0.03055398]
[0.92094839]
[1.12246157]
[0.02071285]

PyBrain-レイヤー

レイヤーは基本的に、ネットワークの非表示レイヤーで使用される一連の機能です。

この章では、レイヤーに関する次の詳細を説明します-

  • レイヤーを理解する
  • Pybrainを使用してレイヤーを作成する

レイヤーを理解する

次のようにレイヤーを使用した例を以前に見ました-

  • TanhLayer
  • SoftmaxLayer

TanhLayerを使用した例

以下は、ネットワークを構築するためにTanhLayerを使用した1つの例です-

*testnetwork.py*
from pybrain.tools.shortcuts import buildNetwork
from pybrain.structure import TanhLayer
from pybrain.datasets import SupervisedDataSet
from pybrain.supervised.trainers import BackpropTrainer

# Create a network with two inputs, three hidden, and one output
nn = buildNetwork(2, 3, 1, bias=True, hiddenclass=TanhLayer)

# Create a dataset that matches network input and output sizes:
norgate = SupervisedDataSet(2, 1)

# Create a dataset to be used for testing.
nortrain = SupervisedDataSet(2, 1)

# Add input and target values to dataset
# Values for NOR truth table
norgate.addSample((0, 0), (1,))
norgate.addSample((0, 1), (0,))
norgate.addSample((1, 0), (0,))
norgate.addSample((1, 1), (0,))

# Add input and target values to dataset
# Values for NOR truth table
nortrain.addSample((0, 0), (1,))
nortrain.addSample((0, 1), (0,))
nortrain.addSample((1, 0), (0,))
nortrain.addSample((1, 1), (0,))

#Training the network with dataset norgate.
trainer = BackpropTrainer(nn, norgate)

# will run the loop 1000 times to train it.
for epoch in range(1000):
   trainer.train()
trainer.testOnData(dataset=nortrain, verbose = True)

出力

上記のコードの出力は次のとおりです-

*python testnetwork.py*
C:\pybrain\pybrain\src>python testnetwork.py
Testing on data:
('out: ', '[0.887 ]')
('correct:', '[1 ]')
error: 0.00637334
('out: ', '[0.149 ]')
('correct:', '[0 ]')
error: 0.01110338
('out: ', '[0.102 ]')
('correct:', '[0 ]')
error: 0.00522736
('out: ', '[-0.163]')
('correct:', '[0 ]')
error: 0.01328650
('All errors:', [0.006373344564625953, 0.01110338071737218,
   0.005227359234093431, 0.01328649974219942])
('Average error:', 0.008997646064572746)
('Max error:', 0.01328649974219942, 'Median error:', 0.01110338071737218)

SoftMaxLayerを使用した例

以下は、SoftmaxLayerを使用してネットワークを構築した1つの例です-

from pybrain.tools.shortcuts import buildNetwork
from pybrain.structure.modules import SoftmaxLayer
from pybrain.datasets import SupervisedDataSet
from pybrain.supervised.trainers import BackpropTrainer

# Create a network with two inputs, three hidden, and one output
nn = buildNetwork(2, 3, 1, bias=True, hiddenclass=SoftmaxLayer)

# Create a dataset that matches network input and output sizes:
norgate = SupervisedDataSet(2, 1)

# Create a dataset to be used for testing.
nortrain = SupervisedDataSet(2, 1)

# Add input and target values to dataset
# Values for NOR truth table
norgate.addSample((0, 0), (1,))
norgate.addSample((0, 1), (0,))
norgate.addSample((1, 0), (0,))
norgate.addSample((1, 1), (0,))

# Add input and target values to dataset
# Values for NOR truth table
nortrain.addSample((0, 0), (1,))
nortrain.addSample((0, 1), (0,))
nortrain.addSample((1, 0), (0,))
nortrain.addSample((1, 1), (0,))

#Training the network with dataset norgate.
trainer = BackpropTrainer(nn, norgate)

# will run the loop 1000 times to train it.
for epoch in range(1000):
trainer.train()
trainer.testOnData(dataset=nortrain, verbose = True)

出力

出力は次のとおりです-

C:\pybrain\pybrain\src>python example16.py
Testing on data:
('out: ', '[0.918 ]')
('correct:', '[1 ]')
error: 0.00333524
('out: ', '[0.082 ]')
('correct:', '[0 ]')
error: 0.00333484
('out: ', '[0.078 ]')
('correct:', '[0 ]')
error: 0.00303433
('out: ', '[-0.082]')
('correct:', '[0 ]')
error: 0.00340005
('All errors:', [0.0033352368788838365, 0.003334842961037291,
   0.003034328685718761, 0.0034000458892589056])
('Average error:', 0.0032761136037246985)
('Max error:', 0.0034000458892589056, 'Median error:', 0.0033352368788838365)

Pybrainでレイヤーを作成する

Pybrainでは、次のように独自のレイヤーを作成できます-

レイヤーを作成するには、 _ NeuronLayer class_ を基本クラスとして使用して、すべてのタイプのレイヤーを作成する必要があります。

from pybrain.structure.modules.neuronlayer import NeuronLayer
class LinearLayer(NeuronLayer):
   def _forwardImplementation(self, inbuf, outbuf):
      outbuf[:] = inbuf
   def _backwardImplementation(self, outerr, inerr, outbuf, inbuf):
      inerr[:] = outer

レイヤーを作成するには、2つのメソッドforwardImplementation()_およびbackwardImplementation()_を実装する必要があります。

*__ forwardImplementation()は2つの引数inbuf_* およびoutbufを取ります。これらはScipy配列です。 そのサイズは、レイヤーの入力および出力の次元に依存します。

__backwardImplementation()_は、指定された入力に対する出力の導関数を計算するために使用されます。

だからPybrainでレイヤーを実装するには、これはレイヤークラスのスケルトンです-

from pybrain.structure.modules.neuronlayer import NeuronLayer
class NewLayer(NeuronLayer):
   def _forwardImplementation(self, inbuf, outbuf):
      pass
   def _backwardImplementation(self, outerr, inerr, outbuf, inbuf):
      pass

あなたが層として二次多項式関数を実装したい場合は、次のようにすることができます-

多項式関数があるとします-

f(x) = 3x2

上記の多項式関数の導関数は次のようになります-

f(x) = 6 x

上記の多項式関数の最終層クラスは次のようになります-

*testlayer.py*
from pybrain.structure.modules.neuronlayer import NeuronLayer
class PolynomialLayer(NeuronLayer):
   def _forwardImplementation(self, inbuf, outbuf):
      outbuf[:] = 3*inbuf**2
   def _backwardImplementation(self, outerr, inerr, outbuf, inbuf):
      inerr[:] = 6*inbuf*outerr

今、下に示すように作成されたレイヤーを利用しましょう-

*testlayer1.py*
from testlayer import PolynomialLayer
from pybrain.tools.shortcuts import buildNetwork
from pybrain.tests.helpers import gradientCheck

n = buildNetwork(2, 3, 1, hiddenclass=PolynomialLayer)
n.randomize()

gradientCheck(n)

GradientCheck()は、レイヤーが正常に機能しているかどうかをテストします。レイヤーが使用されているネットワークをgradientCheck(n)に渡す必要があります。

出力

C:\pybrain\pybrain\src>python testlayer1.py
Perfect gradient

PyBrain-接続

接続はレイヤーと同様に機能します。唯一の違いは、ネットワーク内のあるノードから別のノードにデータをシフトすることです。

この章では、以下について学習します-

  • 接続について
  • 接続を作成する

接続について

ネットワークの作成中に使用される接続の動作例を次に示します。

*ffy.py*
from pybrain.structure import FeedForwardNetwork
from pybrain.structure import LinearLayer, SigmoidLayer
from pybrain.structure import FullConnection

network = FeedForwardNetwork()

#creating layer for input => 2 , hidden=> 3 and output=>1
inputLayer = LinearLayer(2)
hiddenLayer = SigmoidLayer(3)
outputLayer = LinearLayer(1)

#adding the layer to feedforward network
network.addInputModule(inputLayer)
network.addModule(hiddenLayer)
network.addOutputModule(outputLayer)

#Create connection between input ,hidden and output
input_to_hidden = FullConnection(inputLayer, hiddenLayer)
hidden_to_output = FullConnection(hiddenLayer, outputLayer)

#add connection to the network
network.addConnection(input_to_hidden)
network.addConnection(hidden_to_output)
network.sortModules()

print(network)

出力

C:\pybrain\pybrain\src>python ffn.py
FeedForwardNetwork-6
Modules:
[<LinearLayer 'LinearLayer-3'>, <SigmoidLayer 'SigmoidLayer-7'>,
   <LinearLayer 'LinearLayer-8'>]
Connections:
[<FullConnection 'FullConnection-4': 'SigmoidLayer-7' -> 'LinearLayer-8'>,
   <FullConnection 'FullConnection-5': 'LinearLayer-3' -> 'SigmoidLayer-7'>]

接続を作成する

Pybrainでは、以下に示すように接続モジュールを使用して接続を作成できます-

*connect.py*
from pybrain.structure.connections.connection import Connection
class YourConnection(Connection):
   def __init__(self, *args, **kwargs):
      Connection.__init__(self, *args, **kwargs)
   def _forwardImplementation(self, inbuf, outbuf):
      outbuf += inbuf
   def _backwardImplementation(self, outerr, inerr, inbuf):
      inerr += outer

接続を作成するには、forwardImplementation()_とbackwardImplementation()_の2つのメソッドがあります。

__forwardImplementation()_は、_inbuf_という着信モジュールの出力バッファーと、_outbuf_という発信モジュールの入力バッファーで呼び出されます。 _inbuf_は、発信モジュール_outbuf_に追加されます。

backwardImplementation()は、_outerr _、 inerr_、および_inbuf_で呼び出されます。 発信モジュールエラーは、 backwardImplementation()_の着信モジュールエラーに追加されます。

ここで、ネットワークで YourConnection を使用してみましょう。

*testconnection.py*
from pybrain.structure import FeedForwardNetwork
from pybrain.structure import LinearLayer, SigmoidLayer
from connect import YourConnection

network = FeedForwardNetwork()

#creating layer for input => 2 , hidden=> 3 and output=>1
inputLayer = LinearLayer(2)
hiddenLayer = SigmoidLayer(3)
outputLayer = LinearLayer(1)

#adding the layer to feedforward network
network.addInputModule(inputLayer)
network.addModule(hiddenLayer)
network.addOutputModule(outputLayer)

#Create connection between input ,hidden and output
input_to_hidden = YourConnection(inputLayer, hiddenLayer)
hidden_to_output = YourConnection(hiddenLayer, outputLayer)

#add connection to the network
network.addConnection(input_to_hidden)
network.addConnection(hidden_to_output)
network.sortModules()

print(network)

出力

C:\pybrain\pybrain\src>python testconnection.py
FeedForwardNetwork-6
Modules:
[<LinearLayer 'LinearLayer-3'>, <SigmoidLayer 'SigmoidLayer-7'>,
   <LinearLayer 'LinearLayer-8'>]
Connections:
[<YourConnection 'YourConnection-4': 'LinearLayer-3' -> 'SigmoidLayer-7'>,
   <YourConnection 'YourConnection-5': 'SigmoidLayer-7' -> 'LinearLayer-8'>]

PyBrain-強化学習モジュール

強化学習(RL)は、機械学習の重要な部分です。 強化学習により、エージェントは環境からの入力に基づいて行動を学習します。

強化中に相互作用するコンポーネントは次のとおりです-

  • 環境
  • エージェント
  • Task
  • 実験

強化学習のレイアウトは以下のとおりです-

強化学習モジュール

RLでは、エージェントは環境と繰り返し対話します。 各反復で、エージェントは報酬のあるオブザベーションを受け取ります。 次に、アクションを選択し、環境に送信します。 各反復での環境は新しい状態に移行し、毎回受け取った報酬は保存されます。

RLエージェントの目標は、できるだけ多くの報酬を収集することです。 反復の間、エージェントのパフォーマンスは、適切に機能するエージェントのパフォーマンスと比較され、パフォーマンスの違いは報酬または失敗のいずれかを引き起こします。 RLは基本的に、ロボット制御、エレベータ、通信、ゲームなどの問題解決タスクで使用されます。

PybrainでRLを操作する方法を見てみましょう。

迷路*環境*で作業します。これは、1が壁で0が自由フィールドである2次元のnumpy配列を使用して表されます。 エージェントの責任は、フリーフィールド上を移動してゴールポイントを見つけることです。

以下は、迷路環境での作業の段階的な流れです。

ステップ1

以下のコードで必要なパッケージをインポートします-

from scipy import *
import sys, time
import matplotlib.pyplot as pylab # for visualization we are using mathplotlib

from pybrain.rl.environments.mazes import Maze, MDPMazeTask
from pybrain.rl.learners.valuebased import ActionValueTable
from pybrain.rl.agents import LearningAgent
from pybrain.rl.learners import Q, QLambda, SARSA #@UnusedImport
from pybrain.rl.explorers import BoltzmannExplorer #@UnusedImport
from pybrain.rl.experiments import Experiment
from pybrain.rl.environments import Task

ステップ2

以下のコードを使用して迷路環境を作成します-

# create the maze with walls as 1 and 0 is a free field
mazearray = array(
   [[env = Maze(mazearray, (7, 7)) # create the environment, the first parameter is the
maze array and second one is the goal field tuple

ステップ3

次のステップは、エージェントを作成することです。

エージェントはRLで重要な役割を果たします。 getAction()メソッドとintegratedObservation()メソッドを使用して、迷路環境と対話します。

エージェントには、コントローラー(状態をアクションにマップする)と学習者がいます。

PyBrainのコントローラーはモジュールのようなもので、入力はステートであり、アクションに変換されます。

controller = ActionValueTable(81, 4)
controller.initialize(1.)
*_ActionValueTable_* には2つの入力、つまり状態とアクションの数が必要です。 標準的な迷路環境には、北、南、東、西の4つのアクションがあります。

次に、学習者を作成します。 エージェントで使用する学習者にSARSA()学習アルゴリズムを使用します。

learner = SARSA()
agent = LearningAgent(controller, learner)

ステップ4

この手順では、環境にエージェントを追加しています。

エージェントを環境に接続するには、タスクと呼ばれる特別なコンポーネントが必要です。 *タスク*の役割は、環境内の目標と、エージェントがアクションに対する報酬を得る方法を探すことです。

環境には独自のタスクがあります。 使用したMaze環境にはMDPMazeTaskタスクがあります。 MDPは*「マルコフ決定プロセス」*の略で、エージェントが迷路での位置を知っていることを意味します。 環境はタスクのパラメーターになります。

task = MDPMazeTask(env)

ステップ5

環境にエージェントを追加した後の次のステップは、実験を作成することです。

ここで、タスクとエージェントを相互に調整できるように、実験を作成する必要があります。

experiment = Experiment(task, agent)

今、私たちは以下に示すように実験を1000回実行するつもりです-

for i in range(1000):
   experiment.doInteractions(100)
   agent.learn()
   agent.reset()

次のコードが実行されると、環境はエージェントとタスクの間で100回実行されます-

experiment.doInteractions(100)

各反復の後、新しい情報をタスクに返し、エージェントに渡す情報と報酬を決定します。 forループ内でエージェントを学習してリセットした後、新しいテーブルをプロットします。

for i in range(1000):
   experiment.doInteractions(100)
   agent.learn()
   agent.reset()
   pylab.pcolor(table.params.reshape(81,4).max(1).reshape(9,9))
   pylab.savefig("test.png")

ここに完全なコードがあります-

*maze.py*
from scipy import *
import sys, time
import matplotlib.pyplot as pylab

from pybrain.rl.environments.mazes import Maze, MDPMazeTask
from pybrain.rl.learners.valuebased import ActionValueTable
from pybrain.rl.agents import LearningAgent
from pybrain.rl.learners import Q, QLambda, SARSA #@UnusedImport
from pybrain.rl.explorers import BoltzmannExplorer #@UnusedImport
from pybrain.rl.experiments import Experiment
from pybrain.rl.environments import Task

# create maze array
mazearray = array(
   [[env = Maze(mazearray, (7, 7))

# create task
task = MDPMazeTask(env)

#controller in PyBrain is like a module, for which the input is states and
convert them into actions.
controller = ActionValueTable(81, 4)
controller.initialize(1.)

# create agent with controller and learner - using SARSA()
learner = SARSA()

# create agent
agent = LearningAgent(controller, learner)

# create experiment
experiment = Experiment(task, agent)

# prepare plotting
pylab.gray()
pylab.ion()

for i in range(1000):
experiment.doInteractions(100)

agent.learn()
agent.reset()

pylab.pcolor(controller.params.reshape(81,4).max(1).reshape(9,9))
pylab.savefig("test.png")

出力

*python maze.py*

Python迷路

自由フィールドの色は、反復ごとに変更されます。

PyBrain-APIとツール

これで、ネットワークを構築してトレーニングする方法がわかりました。 この章では、ネットワークを作成して保存し、必要に応じてネットワークを使用する方法を理解します。

ネットワークの保存と回復

PybrainツールのNetworkWriterとNetworkReader、つまりpybrain.tools.customxmlを使用します。

ここに同じの実例があります-

from pybrain.tools.shortcuts import buildNetwork
from pybrain.tools.customxml import NetworkWriter
from pybrain.tools.customxml import NetworkReader

net = buildNetwork(2,1,1)
NetworkWriter.writeToFile(net, 'network.xml')
net = NetworkReader.readFrom('network.xml')

ネットワークはnetwork.xml内に保存されます。

NetworkWriter.writeToFile(net, 'network.xml')

必要に応じてXMLを読み取るには、次のコードを使用できます-

net = NetworkReader.readFrom('network.xml')

ここに作成されたnetwork.xmlファイルがあります-

<?xml version="1.0" ?>
<PyBrain>
   <Network class="pybrain.structure.networks.feedforward.FeedForwardNetwork" name="FeedForwardNetwork-8">
      <name val="'FeedForwardNetwork-8'"/>
      <Modules>
         <LinearLayer class="pybrain.structure.modules.linearlayer.LinearLayer" inmodule="True" name="in">
            <name val="'in'"/>
            <dim val="2"/>
         </LinearLayer>

         <LinearLayer class="pybrain.structure.modules.linearlayer.LinearLayer" name="out" outmodule="True">
            <name val="'out'"/>
            <dim val="1"/>
         </LinearLayer>

         <BiasUnit class="pybrain.structure.modules.biasunit.BiasUnit" name="bias">
            <name val="'bias'"/>
         </BiasUnit>

         <SigmoidLayer class="pybrain.structure.modules.sigmoidlayer.SigmoidLayer" name="hidden0">
            <name val="'hidden0'"/>
            <dim val="1"/>
         </SigmoidLayer>
      </Modules>

      <Connections>
         <FullConnection class="pybrain.structure.connections.full.FullConnection" name="FullConnection-6">
            <inmod val="bias"/>
            <outmod val="out"/>
            <Parameters>[1.2441093186965146]</Parameters>
         </FullConnection>

         <FullConnection class="pybrain.structure.connections.full.FullConnection" name="FullConnection-7">
            <inmod val="bias"/>
            <outmod val="hidden0"/>
            <Parameters>[-1.5743530012126412]</Parameters>
         </FullConnection>

         <FullConnection class="pybrain.structure.connections.full.FullConnection" name="FullConnection-4">
            <inmod val="in"/>
            <outmod val="hidden0"/>
            <Parameters>[-0.9429546042034236, -0.09858196752687162]</Parameters>
         </FullConnection>

         <FullConnection class="pybrain.structure.connections.full.FullConnection" name="FullConnection-5">
            <inmod val="hidden0"/>
            <outmod val="out"/>
            <Parameters>[-0.29205472354634304]</Parameters>
         </FullConnection>
      </Connections>

   </Network>
</PyBrain>

API

以下は、このチュートリアル全体で使用したAPIのリストです。

ネットワーク向け

  • * activate(input)*-パラメータ、つまりテストする値を受け取ります。 指定された入力に基づいて結果を返します。
  • * activateOnDataset(dataset)*-指定されたデータセットを反復処理し、出力を返します。
  • * addConnection(c)*-ネットワークへの接続を追加します。
  • * addInputModule(m)*-ネットワークに与えられたモジュールを追加し、入力モジュールとしてマークします。
  • * addModule(m)*-指定されたモジュールをネットワークに追加します。
  • * addOutputModule(m)*-ネットワークにモジュールを追加し、出力モジュールとしてマークします。
  • * reset()*-モジュールとネットワークをリセットします。
  • * sortModules()*-内部でソートすることにより、アクティベーションのためにネットワークを準備します。 アクティベーションの前に呼び出す必要があります。

監視対象データセットの場合

  • * addSample(inp、target)*-入力とターゲットの新しいサンプルを追加します。
  • * splitWithProportion(proportion = 0.5)*-データセットを2つの部分に分割します。最初の部分には比例部分のデータが含まれ、次のセットには残りの部分が含まれます。

トレーナー向け

  • trainUntilConvergence(dataset = None、maxEpochs = None、verbose = None、continueEpochs = 10、validationProportion = 0.25)*-データセット上でモジュールが収束するまでトレーニングするために使用されます。 データセットが指定されていない場合、開始時に使用されたトレーニング済みデータセットでトレーニングを試みます。

PyBrain-例

この章では、PyBrainを使用して実行されるすべての可能な例がリストされています。

例1

NOR真理値表を使用して、正確性をテストします。

from pybrain.tools.shortcuts import buildNetwork
from pybrain.structure import TanhLayer
from pybrain.datasets import SupervisedDataSet
from pybrain.supervised.trainers import BackpropTrainer

# Create a network with two inputs, three hidden, and one output
nn = buildNetwork(2, 3, 1, bias=True, hiddenclass=TanhLayer)

# Create a dataset that matches network input and output sizes:
norgate = SupervisedDataSet(2, 1)

# Create a dataset to be used for testing.
nortrain = SupervisedDataSet(2, 1)

# Add input and target values to dataset
# Values for NOR truth table
norgate.addSample((0, 0), (1,))
norgate.addSample((0, 1), (0,))
norgate.addSample((1, 0), (0,))
norgate.addSample((1, 1), (0,))

# Add input and target values to dataset
# Values for NOR truth table
nortrain.addSample((0, 0), (1,))
nortrain.addSample((0, 1), (0,))
nortrain.addSample((1, 0), (0,))
nortrain.addSample((1, 1), (0,))

#Training the network with dataset norgate.
trainer = BackpropTrainer(nn, norgate)

# will run the loop 1000 times to train it.
for epoch in range(1000):
   trainer.train()
trainer.testOnData(dataset=nortrain, verbose = True)

出力

C:\pybrain\pybrain\src>python testnetwork.py
Testing on data:
('out: ', '[0.887 ]')
('correct:', '[1 ]')
error: 0.00637334
('out: ', '[0.149 ]')
('correct:', '[0 ]')
error: 0.01110338
('out: ', '[0.102 ]')
('correct:', '[0 ]')
error: 0.00522736
('out: ', '[-0.163]')
('correct:', '[0 ]')
error: 0.01328650
('All errors:', [0.006373344564625953, 0.01110338071737218,
   0.005227359234093431, 0.01328649974219942])
('Average error:', 0.008997646064572746)
('Max error:', 0.01328649974219942, 'Median error:', 0.01110338071737218)

例2

データセットについては、以下に示すように、sklearnデータセットのデータセットを使用します。 scikit-learn.org]

10のクラス、つまり0-9から予測される数字があります。

Xの合計入力データは64です。

from sklearn import datasets
import matplotlib.pyplot as plt

from pybrain.datasets import ClassificationDataSet
from pybrain.utilities import percentError
from pybrain.tools.shortcuts import buildNetwork
from pybrain.supervised.trainers import BackpropTrainer
from pybrain.structure.modules import SoftmaxLayer
from numpy import ravel

digits = datasets.load_digits()
X, y = digits.data, digits.target
ds = ClassificationDataSet(64, 1, nb_classes=10) )

# we are having inputs are 64 dim array and since the digits are from 0-9
the classes considered is 10.

for i in range(len(X)):
ds.addSample(ravel(X[i]), y[i]) # adding sample to datasets
test_data_temp, training_data_temp = ds.splitWithProportion(0.25)

#Splitting the datasets 25% as testdata and 75% as trained data
# Using splitWithProportion() method on dataset converts the dataset to
#superviseddataset, so we will convert the dataset back to classificationdataset
#as shown in above step.
test_data = ClassificationDataSet(64, 1, nb_classes=10)

for n in range(0, test_data_temp.getLength()):
test_data.addSample( test_data_temp.getSample(n)[0], test_data_temp.getSample(n)[1] )
training_data = ClassificationDataSet(64, 1, nb_classes=10)

for n in range(0, training_data_temp.getLength()):
training_data.addSample(
   training_data_temp.getSample(n)[0], training_data_temp.getSample(n)[1]
)
test_data._convertToOneOfMany()
training_data._convertToOneOfMany()
net = buildNetwork(
   training_data.indim, 64, training_data.outdim, outclass=SoftmaxLayer
)
#creating a network wherein the input and output are used from the training data.
trainer = BackpropTrainer(
   net, dataset=training_data, momentum=0.1,learningrate=0.01,verbose=True,weightdecay=0.01
)
#Training the Network
trnerr,valerr = trainer.trainUntilConvergence(dataset=training_data,maxEpochs=10)

#Visualizing the error and validation data
plt.plot(trnerr,'b',valerr,'r')
plt.show()
trainer.trainEpochs(10)
print('Percent Error on testData:',percentError(
   trainer.testOnClassData(dataset=test_data), test_data['class']
))

出力

From Datasets From

Total error: 0.0432857814358
Total error: 0.0222276374185
Total error: 0.0149012052174
Total error: 0.011876985318
Total error: 0.00939854792853
Total error: 0.00782202445183
Total error: 0.00714707652044
Total error: 0.00606068893793
Total error: 0.00544257958975
Total error: 0.00463929281336
Total error: 0.00441275665294
('train-errors:', '[0.043286 , 0.022228 , 0.014901 , 0.011877 , 0.009399 , 0.007
   822 , 0.007147 , 0.006061 , 0.005443 , 0.004639 , 0.004413 ]')
('valid-errors:', '[0.074296 , 0.027332 , 0.016461 , 0.014298 , 0.012129 , 0.009
   248 , 0.008922 , 0.007917 , 0.006547 , 0.005883 , 0.006572 , 0.005811 ]')
Percent Error on testData: 3.34075723830735