2017-03-14 52 views
1

有沒有一種方法可以訓練pybrain識別單個神經網絡中的多個模式?舉例來說,我已經添加了兩種不同模式的幾個排列: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 ),爲此我希望它會返回[100 [1-9],100 [1-9]](第二個模式),但它返回[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) 

[[編輯]]添加了分類變量和ClassificationDataSet。

[[編輯1]]增加了更大的訓練集和看不見的集合

回答

1

是的,有。這裏的問題是你選擇的表示。您正在訓練網絡以輸出實數,因此您的NN是一個近似於您在數據集中採樣和提供的函數的函數。因此,一些值在10000和40000之間的結果。

看起來更像是您在尋找classifier。 鑑於你的描述,我假設你有一個明確定義的模式集,你正在尋找。然後你必須將你的模式映射到一個分類變量。例如,您提到的模式1 (200[1-9], 200[1-9]),(400[1-9],400[1-9])將爲0,模式2將爲1,依此類推。

然後,您將訓練網絡以輸出輸入模式所屬的類(0,1,...)。 可以說,考慮到你的模式的結構,基於規則的分類可能比人工神經網絡更適合。

關於數據量,您需要更多的數據。最後,最基本的方法是將數據集分成兩組(例如70-30)。您使用70%的樣本進行培訓,剩下的30%用作未看到的數據(測試數據),以評估模型的泛化/過度擬合。一旦基本運行,您可能想閱讀有關交叉驗證的內容。

+0

我添加了一個ClassificaitonDataSet,並放入類似你所說的變量,但它不能識別正確的模式。它是否需要更多的數據或訓練時期? –

+0

是的,你還需要更多的數據。我沒有補充說,因爲我假設你只是舉個例子。立即查看更新。 – rll

+0

我顯然是在做錯事。我在訓練數據集中添加了1000行,而在未見的情況下添加了100行。它仍然沒有猜測正確的模式100%的時間.. –