2017-03-14 8 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]) 

그런 다음 내 자율 데이터 세트에 대한 I 추가 (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을 찾고있는 것처럼 보입니다. 귀하의 설명을 통해 나는 당신이 찾고있는 명확하게 정의 된 패턴 집합을 가지고 있다고 가정합니다. 그런 다음 패턴을 범주 형 변수에 매핑해야합니다. 예를 들어, (200[1-9], 200[1-9]),(400[1-9],400[1-9])을 언급 한 패턴 1은 0이되고, 패턴 2는 1이 될 것입니다.

그런 다음 입력 패턴이 속한 클래스 (0,1, ...)를 출력하도록 네트워크를 학습합니다. 아마도 패턴의 구조를 고려할 때 규칙 기반 분류가 ANN보다 더 적절할 것입니다.

데이터 양에 관해서는 더 많은 것을 필요로합니다. 팁 : 가장 기본적인 접근 방법은 데이터 세트를 두 개의 그룹 (예 : 70-30)으로 분할하는 것입니다. 교육을 위해 샘플의 70 %를 사용하고 보이지 않는 데이터 (테스트 데이터)로 사용하는 나머지 30 %를 사용하여 모델의 일반화/초과 조정을 평가합니다. 기본 실행을 얻은 후에 상호 유효성 검사에 대해 읽어 볼 수 있습니다.

+0

ClassificaitonDataSet을 추가하고 올바른 패턴을 식별하지 못했지만 범주 형 변수를 넣었습니다. 더 많은 데이터 또는 교육 신기원이 필요합니까? –

+0

네, 더 많은 데이터가 필요합니다. 나는 당신이 단지 예제를 게시했다고 가정 한 이후로 추가하지 않았습니다. 지금 업데이트를 참조하십시오. – rll

+0

나는 분명히 뭔가 잘못하고있다. 훈련 데이터 세트에 1000 개의 행을 추가하고 보이지 않는 곳에 100 개를 추가했다. 그 시간의 정확한 패턴을 100 % 추측하지 못했습니다 .. –