4

저는 약간의 프로젝트를 만들고 싶습니다. 파이썬과 함께 신경망을 사용하고 싶습니다. pybrain이 최상의 솔루션이라는 것을 알았습니다. 그러나 지금까지 내가 발견 한 모든 모범과 질문은 나를 도울 수 없습니다.신경망 시퀀스의 누락 값을 채우기

나는 일련의 숫자를 가지고 있습니다. 수백 줄. 일부 값이 누락되어 숫자 대신 "x"가 있습니다. 예

1425234838636**x**40543485435097**x**43953458345345430843967067045764607457607645067045**x**04376037654067458674506704567408576405 

등 들어

. 이것은 단지 예일뿐입니다. 내 순서가 아니야.

가치를 하나씩 읽고 신경 네트워크를 훈련 시키려고 생각했습니다. 'x'가 하나 발견되면 그 숫자를 예측하고 다음 숫자로 계속 훈련 할 것입니다.

지금 약간의 입력과 일부 출력이 하나

trainSet.addSample([0,0,0,0],[1]) 

처럼 훈련 때까지 내가 찾은 무엇.

조언을 계속하려면 어떻게해야합니까?

편집 : 내가 뭔가를 파악하고 나는 그것이 맞다면 내가 알고하지 않기 때문에, 피드백을 받고 싶습니다.

나는 여전히 위의 문자열을 가지고 있습니다. 목록으로 나눠서 각 엔티티가 숫자 인 목록을 만들었습니다.

for ind in range(len(myList)): 
    if not myList[ind] == "x" and not myList[ind+1]=="x": 
     ds.addSample(myList[ind],myList[ind+1]) 
    else: 
     break 

net = FeedForwardNetwork() 
inp = LinearLayer(1) 
h1 = SigmoidLayer(1) 
outp = LinearLayer(1) 

net.addOutputModule(outp) 
net.addInputModule(inp) 
net.addModule(h1) 

net.addConnection(FullConnection(inp, h1)) 
net.addConnection(FullConnection(h1, outp)) 

net.sortModules() 

trainer = BackpropTrainer(net, ds) 
trainer.trainOnDataset(ds,1000) 
trainer.testOnData(verbose=True) 

lis[ind+1] = net.activate((ind,)) 

GO to the beggining and continue from the last "x" which replaced from the net.activate() 

어떻게 생각하십니까? 이 같은 것이 효과가 있다고 생각합니까?

+0

: 나는 x이있는 경우에 당신이로 설정 데이터를 업데이트 할,하지만 이전 n 숫자의 함수가 될 것입니다 추측하고있다 학습 사이트 : http://area51.stackexchange.com/proposals/41738/machine-learning – travisbartley

답변

2

일반적으로 역 전파를 사용하여 ANN을 학습하는 경우 기본적으로 입출력 맵을 학습합니다. 이것은 훈련 세트가 알려진 입출력 관계 (훈련 세트에 포함 된 알려지지 않은 값이 없음)를 포함해야 함을 의미합니다. 그러면 ANN은 입력과 출력 간의 실제 관계에 대한 근사치가됩니다.

그런 다음 x = net.activate([seq])을 호출 할 수 있습니다. seq은 알 수없는 값인 x과 관련된 입력 시퀀스입니다.

x이 알려진 결과에 대해 알 수없는 입력 시퀀스 인 경우 ANN의 역함수를 호출해야합니다. 나는 pybrain에서 ANN을 뒤집는 간단한 방법이 없다고 생각하지만, 원래의 훈련 데이터의 역함수로 ANN을 훈련시킬 수 있습니다. 즉, 알려진 결과를 학습 입력으로 사용하고 관련 시퀀스를 학습 결과로 사용하십시오.

고려해야 할 주요 사항은 도구의 적합성과 수행하려는 작업에 대한 교육 데이터입니다. 이전 숫자의 함수로 x을 예측하기를 원한다면 올바르게 훈련했다고 생각합니다. 당신은 기계로 합류 고려할 수있다, 당신은 신경 네트워크에 관심이 있다면

n = 10 
for ind in range(len(myList)): 
    # Don't overrun our bounds 
    if ind == len(myList)-1: 
     break 

    # Check that our sequence is valid 
    for i in range(ind-n, ind+1): 
     if i >= 0 and myList[i] == "x": 
      # we have an invalid sequence 
      ind += i # start next seq after invalid entry 
      break 

    # Add valid training sequence to data set 
    ds.addSample(myList[ind-n:ind],myList[ind+1]) 
+0

Hello @Engineero. 귀하의 대답에 문제는 입력마다 길이가 다를 것입니다. 그리고이 Ds = SupervisedDataSet (1, 1)과 같이 내 NN을 설정하면 입력 시퀀스의 수를 수정해야한다고 생각합니다. 나는 길이가 10 인 샘플을 추가 할 수 있는지, 그리고 다른 반복에서는 길이가 20 인 다른 샘플을 추가 할 수 있는지 모른다. – Tasos

+0

@Tasos, 위의 루프를 for in range (n, len (myList)) :와 같이 시작할 수 있습니다. 그러면 길이 = 10 입력 교육 시퀀스로 끝나야합니다. – Engineero

+0

내가 선택한 수정 번호로 샘플을 추가하는 것이 좋습니다. 1보다 큰 숫자는 더 나은 예측을하는 것이 좋습니다. 권리? – Tasos

1

나는 당신이 그 파이썬 라이브러리가 아닌 특정 대답을 줄 수 있지만, 내가보기, 당신이 신경 그물을 가지고 있고 양식의 샘플에게 그것을

 
    [ i0 i1 ... i n ] --> [ o0 o1 ... on ] 
    (input vector)  (output vector) 

지금 당신이 훈련하여 그물을 제공 당신의 그물은 그것에게 선물되는 수의 순서에 관하여 모른다, 그 순서는 훈련 한 그물의 결과를 위해서만 재미있다.

네트워크를 얻으려면 연속되는 숫자의 벡터를 입력으로 사용하고 원하는 단일 숫자를 출력으로 표시 할 수있는 시퀀스를 알고 있어야합니다. 내가 이것을 사용하여 생각

 
    Sequence: 1 2 3 4 X 2 3 4 5 6 7 8 
    Training with input length 3, output length 1: 
    [1 2 3] -> 4 
    [2 3 4] -> 5 (the second one, as the first one is not available) 
    [3 4 5] -> 6 
    [4 5 6] -> 7 
    [5 6 7] -> 8 

, 당신의 그물이 입력 순서에 조금 적응할 수 : 당신은 X 예를 포함하는 시퀀스를 오티 둡니다. 올바른 교육 과정을 입력으로 추출하는 "방법"은 도메인 전문가 (귀하)에게 맡겨야합니다.

1

설명하는 것은 Imputation이라는 통계 응용 프로그램입니다. 데이터에 누락 된 값을 대체하십시오. 전통적인 접근 방식은 신경망을 포함하지 않지만 확실하게는 research in this direction입니다. 이것은 내 지역이 아니지만 문학을 확인하는 것이 좋습니다.