2017-03-14 15 views
1

pybrainをトレーニングして1つのニューラルネット内の複数のパターンを認識する方法はありますか?Pybrainによるパターン認識

まずパターン:

(200[1-9], 200[1-9]),(400[1-9],400[1-9]) 

第二のパターン:

(900[1-9], 900[1-9]),(100[1-9],100[1-9]) 

それから私が追加私の教師なしデータセット(90002、90009のために例えば、私は2つの異なるパターンのいくつかの並べ替えを追加しました)、それは[100 [1-9]、100 [1-9]](2番目のパターン)を返すことを望んでいましたが、[25084,25084]を返します。私はすべての入力が与えられれば最高の価値を見出そうとしていることを認識していますが、意味があればセット内の特定のパターンを区別しようとしています。

これは私が働いているからである例:

Request for example: Recurrent neural network for predicting next value in a sequence

from pybrain.tools.shortcuts import buildNetwork 
from pybrain.supervised.trainers import BackpropTrainer 
from pybrain.datasets import SupervisedDataSet,UnsupervisedDataSet 
from pybrain.structure import LinearLayer 
from pybrain.datasets import ClassificationDataSet 
from pybrain.structure.modules.sigmoidlayer import SigmoidLayer 
import random 

ds = ClassificationDataSet(2, 1) 

tng_dataset_size = 1000 
unseen_dataset_size = 100 
print 'training dataset size is ', tng_dataset_size 
print 'unseen dataset size is ', unseen_dataset_size 
print 'adding data..' 
for x in range(tng_dataset_size): 
    rand1 = random.randint(1,9) 
    rand2 = random.randint(1,9) 

    pattern_one_0 = int('2000'+str(rand1)) 
    pattern_one_1 = int('2000'+str(rand2)) 
    pattern_two_0 = int('9000'+str(rand1)) 
    pattern_two_1 = int('9000'+str(rand2)) 
    ds.addSample((pattern_one_0,pattern_one_1),(0))#pattern 1, maps to 0 
    ds.addSample((pattern_two_0,pattern_two_1),(1))#pattern 2, maps to 1 


unsupervised_results = [] 

net = buildNetwork(2, 1, 1, outclass=LinearLayer,bias=True, recurrent=True) 
print 'training ...' 
trainer = BackpropTrainer(net, ds) 
trainer.trainEpochs(500) 


ts = UnsupervisedDataSet(2,) 
print 'adding pattern 2 to unseen data' 
for x in xrange(unseen_dataset_size): 
    pattern_two_0 = int('9000'+str(rand1)) 
    pattern_two_1 = int('9000'+str(rand1)) 

    ts.addSample((pattern_two_0, pattern_two_1))#adding first part of pattern 2 to unseen data 
    a = [int(i) for i in net.activateOnDataset(ts)[0]]#should map to 1 

    unsupervised_results.append(a[0]) 

print 'total hits for pattern 1 ', unsupervised_results.count(0) 
print 'total hits for pattern 2 ', unsupervised_results.count(1) 

[[EDIT]]はカテゴリ変数とClassificationDataSetを追加しました。

[EDIT 1]を加え、より大きなトレーニングセットと見えないセット

答えて

1

はいあります。ここでの問題は、あなたが選んだ表現です。実数を出力するようにネットワークを訓練しているので、NNは、データセットでサンプリングして提供した関数にある程度近似する関数です。したがって、10000から40000の間の値の結果。

classifierを探しているように見えます。 あなたの記述があれば、私はあなたが探しているパターンの明確に定義されたセットを持っていると仮定しています。パターンをカテゴリ変数にマップする必要があります。例えば、(200[1-9], 200[1-9]),(400[1-9],400[1-9])というパターン1は0、パターン2は1となります。

次に、入力パターンが属するクラス(0,1、...)を出力するようにネットワークを訓練します。 おそらく、あなたのパターンの構造を考えれば、ルールベースの分類はおそらくANNよりも適切でしょう。

データ量については、もっと多くのデータが必要です。ヒントとして、最も基本的なアプローチは、データセットを2つのグループ(70-30など)に分割することです。トレーニングのサンプルは70%、残りの30%は見えないデータ(テストデータ)として使用して、モデルの一般化/オーバーフィッティングを評価します。クロスバリデーションについては、基礎を理解した上で読むことができます。

+0

私はClassificaitonDataSetを追加し、あなたが言ったようなカテゴリ変数に入れましたが、正しいパターンを特定することはできません。より多くのデータやトレーニングのエポックが必要ですか? –

+0

はい、さらに多くのデータが必要です。私はあなたがただの例を掲示したと仮定して以来、私はそれを追加しませんでした。今すぐアップデートをご覧ください。 – rll

+0

私は明らかに何か間違っていると思います。トレーニングデータセットに1000行を追加し、目に見えない部分に100を追加しました。それはまだ時間の100%正しいパターンを推測していない.. –

関連する問題