2016-09-06 8 views
2

バイナリを学ぶためにネットワーク(PyBrain)を取得しようとしています。この私のコードとそれは約8の戻り値を保持しますが、このターゲットでアクティブにすると9に戻るはずです。PyBrainがバイナリを学ぶことができない理由

from pybrain.tools.shortcuts import buildNetwork 
from pybrain.structure import * 
from pybrain.datasets import * 
from pybrain.supervised.trainers import BackpropTrainer 
from matplotlib.pyplot import * 


trains = 3000 
hiddenLayers = 4 
dim = 4 
target = (1, 0, 0, 1) 

ds = SupervisedDataSet(dim, 1) 

ds.addSample((0, 0, 0, 0), (0,)) 
ds.addSample((0, 0, 0, 1), (1,)) 
ds.addSample((0, 0, 1, 0), (2,)) 
ds.addSample((0, 0, 1, 1), (3,)) 
ds.addSample((0, 1, 0, 0), (4,)) 
ds.addSample((0, 1, 0, 1), (5,)) 
ds.addSample((0, 1, 1, 0), (6,)) 
ds.addSample((0, 1, 1, 1), (7,)) 
ds.addSample((1, 0, 0, 0), (8,)) 


net = buildNetwork(dim, hiddenLayers, 1, bias=True, hiddenclass=SigmoidLayer) 
trainer = BackpropTrainer(net, ds) 

tests = [] 

for i in range(trains): 
    trainer.train() 
    tests.append(net.activate(target)) 


plot(range(len(tests)), tests) 


print net.activate(target) 
show() 

私はSigmoidLayerに番号隠れ層、TanhLayerからhiddenclassを調整しようとした列車の数を変化させるが、それは常に約500回(データセットにネットワークを訓練する)に収束しています。私は背部伝播とは違うトレーナーを使用するべきですか?もしそうなら、なぜですか?

+0

いつも約500に収束しますか? 500何? –

+0

ネットワークをデータセットにトレーニングした後に500回 – Evan

+0

どのような出力伝達関数を使用していますか?タンシグ?リニア? – DrFalk3n

答えて

2

4つの入力ノード、4つの隠れノード、1つの出力ノード、および2つのバイアスを持つネットワークを構築しました。そのノードのための活性化などの各文字を考慮

enter image description here

、我々は、各隠れノードは、シグモイドワット(W * 1 + W * A + *としての活性を計算すると言うことができBのワット * C + W + * D)、及び出力ノードがワット(W * 1 + W * E + W * F +としての活性を計算3 * G + w * H)(シグモイドなし)。図中の線の数は、学習中に微調整されたモデル内の重みパラメータの数です。

非常に多くのパラメータがありますが、訓練するサンプルは9つしかありません。ネットワークが収束できるローカルで最適な解決策はたくさんあります。

これを修正する方法の1つは、トレーニングサンプルの数を増やすことです。過去1秒と0秒を一般化し、((0、0、1.0、0.5)、(2.5、))と((0,1.2,0.0,1.0)、(5.8、))などのサンプルを提供することができます。

もう1つの選択肢は、モデルを単純化することです。完璧なソリューションを得るために必要なのは、バイアスまたはシグモイドなしで出力に直接接続された4つの入力です。そのモデルは、トレーニングが1,2,4、および8に設定される4つの重みしか持たない。最終計算は1 * A + 2 * B + 4 * C + 8 * Dとなる。

1

私はあなたがフリンジの代わりに真ん中に何かを作ることをお勧めします。

訓練データを10と11で上に拡大してみましたが、訓練データから9を除いても、9を予測するとより良い結果が得られました。また、トレーニングデータに4がなくても、4を予測しようとするとかなり良い結果が得られます。

私の経験から、神経回路網はテストデータの境界線を越える数字を容易に推測するとは思わないでしょう。

関連する問題