복붙노트

[PYTHON] PyBrain을 사용한 신경망 훈련은 수렴하지 않습니다.

PYTHON

PyBrain을 사용한 신경망 훈련은 수렴하지 않습니다.

PyBrain 튜토리얼에서 다음 코드를 얻었습니다.

from pybrain.datasets import SupervisedDataSet
from pybrain.supervised.trainers import BackpropTrainer
from pybrain.tools.shortcuts import buildNetwork
from pybrain.structure.modules import TanhLayer

ds = SupervisedDataSet(2, 1)
ds.addSample((0,0), (0,))
ds.addSample((0,1), (1,))
ds.addSample((1,0), (1,))
ds.addSample((1,1), (0,))

net     = buildNetwork(2, 3, 1, bias=True, hiddenclass=TanhLayer)
trainer = BackpropTrainer(net, ds)

for inp, tar in ds:
     print [net.activate(inp), tar]

errors  = trainer.trainUntilConvergence()

for inp, tar in ds:
     print [net.activate(inp), tar]

그러나 그 결과는 잘 훈련되지 않은 신경 네트워크입니다. 오류 출력을 살펴보면 네트워크는 제대로 훈련되지만, 'continueEpochs'인수를 사용하여 더 많은 훈련을하고 네트워크 성능이 저하됩니다. 따라서 네트워크가 수렴하고 있지만 가장 잘 훈련 된 네트워크를 얻을 수있는 방법은 없습니다. PyBrain의 문서는 네트워크가 가장 잘 훈련 된 것으로 반환된다는 것을 의미하지만 오류의 튜플을 반환합니다.

continueEpochs를 0으로 설정하면 continueEpochs가 0보다 커야합니다 (ValueError : max () arg는 빈 시퀀스 임).

문서화와 코드에 큰 차이가 있기 때문에 PyBrain을 실제로 유지 관리하고 있습니까?

해결법

  1. ==============================

    1.좀 더 파고 가면서 나는 PyBrain의 튜토리얼에있는 예제가 완전히 어긋난다는 것을 발견했다.

    좀 더 파고 가면서 나는 PyBrain의 튜토리얼에있는 예제가 완전히 어긋난다는 것을 발견했다.

    소스 코드에서 메서드 시그니처를 살펴보면 다음과 같습니다.

    def trainUntilConvergence(self, dataset=None, maxEpochs=None, verbose=None, continueEpochs=10, validationProportion=0.25):
    

    즉, 훈련 세트의 25 %가 검증에 사용됩니다. 네트워크에서 데이터를 학습 할 때 매우 유용한 방법이지만, 네 가지 가능한 가능성을 모두 갖추고있을 때는이를 수행하지 않을 것입니다. 즉, 4 행 XOR 2-in-1-out 솔루션 세트입니다. 하나의 XOR 세트를 트레이닝하려는 경우 유효성 검사를 위해 행 중 하나를 제거하면 즉각적인 결과로 매우 희소 한 트레이닝 세트를 얻을 수 있습니다. 가능한 조합 중 하나가 생략되어 훈련되지 않은 가중치로 자동으로 생성됩니다.

    일반적으로 유효성 검사를 위해 데이터의 25 %를 생략하면 25 %가 네트워크에서 이미 발생 된 솔루션 공간의 '대부분'을 차지한다고 가정하여이를 수행합니다. 이 경우 사실이 아니며 유효성 검사를 위해 제거한 이후 완전히 네트워크에서 알 수없는 솔루션 공간의 25 %를 차지합니다.

    따라서 트레이너는 네트워크를 올바르게 교육하고 있었지만 XOR 문제의 25 %를 생략하면 네트워크가 심하게 손상되었습니다.

    빠른 시작 인 PyBrain 웹 사이트의 다른 예는 매우 유용 할 것입니다. 왜냐하면이 예는이 XOR 사례에서 명백히 잘못 되었기 때문입니다. 그들이 무작위로 잘못 훈련 된 네트워크를 출력하기 때문에 예제를 직접 시도했는지 궁금 할 것입니다.

  2. ==============================

    2.나는 Andrew Ng가 가르쳤던 Coursera에서 우수한 Machine Learning 수업을 들었고, 수업의 한 부분에서 xor를 인식 할 수있는 작은 신경망을 교육했습니다. 그래서 저는 수렴하지 않은 빠른 시작 부분을 기반으로하는 pybrain 예제에 조금 문제가있었습니다.

    나는 Andrew Ng가 가르쳤던 Coursera에서 우수한 Machine Learning 수업을 들었고, 수업의 한 부분에서 xor를 인식 할 수있는 작은 신경망을 교육했습니다. 그래서 저는 수렴하지 않은 빠른 시작 부분을 기반으로하는 pybrain 예제에 조금 문제가있었습니다.

    나는 최소한의 데이터 세트가 훈련과 유효성 검사로 나누어 져 있다는 점을 포함하여 많은 이유가 있다고 생각한다. 코스의 어느 시점에서 Andrew는 "가장 좋은 알고리즘을 가진 사람이 아니라 가장 많은 데이터를 가진 사람"이라고 말하면서 2000 년대의 데이터 가용성의 폭발이 AI에서의 부활, 이제는 기계 학습이라고합니다.

    모든 것을 염두에두고 나는 그것을 발견했다.

    다음은 작동하는 몇 가지 코드입니다.

    from pybrain.datasets import SupervisedDataSet
    
    dataModel = [
        [(0,0), (0,)],
        [(0,1), (1,)],
        [(1,0), (1,)],
        [(1,1), (0,)],
    ]
    
    ds = SupervisedDataSet(2, 1)
    for input, target in dataModel:
        ds.addSample(input, target)
    
    # create a large random data set
    import random
    random.seed()
    trainingSet = SupervisedDataSet(2, 1);
    for ri in range(0,1000):
        input,target = dataModel[random.getrandbits(2)];
        trainingSet.addSample(input, target)
    
    from pybrain.tools.shortcuts import buildNetwork
    net = buildNetwork(2, 2, 1, bias=True)
    
    from pybrain.supervised.trainers import BackpropTrainer
    trainer = BackpropTrainer(net, ds, learningrate = 0.001, momentum = 0.99)
    trainer.trainUntilConvergence(verbose=True,
                                  trainingData=trainingSet,
                                  validationData=ds,
                                  maxEpochs=10)
    
    print '0,0->', net.activate([0,0])
    print '0,1->', net.activate([0,1])
    print '1,0->', net.activate([1,0])
    print '1,1->', net.activate([1,1])
    
  3. ==============================

    3.

    trainer = BackpropTrainer(net, ds, learningrate = 0.9, momentum=0.0, weightdecay=0.0, verbose=True) 
    trainer.trainEpochs(epochs=1000)
    

    이 방법은 수렴 할 수 있습니다. 학습률이 너무 작 으면 (예 : 0.01), 지역 최소로 손실됩니다. 내가 시험했듯이, 0.3-30의 학습률로 수렴 할 수 있습니다.

  4. ==============================

    4.다음은 올바른 결과를 지속적으로 제공하는 것 같습니다.

    다음은 올바른 결과를 지속적으로 제공하는 것 같습니다.

    from pybrain.tools.shortcuts import buildNetwork
    from pybrain.structure import TanhLayer
    from pybrain.datasets import SupervisedDataSet
    from pybrain.supervised.trainers import BackpropTrainer
    
    #net = buildNetwork(2, 3, 1, bias=True, hiddenclass=TanhLayer)
    net = buildNetwork(2, 3, 1, bias=True)
    
    ds = SupervisedDataSet(2, 1)
    ds.addSample((0, 0), (0,))
    ds.addSample((0, 1), (1,))
    ds.addSample((1, 0), (1,))
    ds.addSample((1, 1), (0,))
    ds.addSample((0, 0), (0,))
    ds.addSample((0, 1), (1,))
    ds.addSample((1, 0), (1,))
    ds.addSample((1, 1), (0,))
    ds.addSample((0, 0), (0,))
    ds.addSample((0, 1), (1,))
    ds.addSample((1, 0), (1,))
    ds.addSample((1, 1), (0,))
    ds.addSample((0, 0), (0,))
    ds.addSample((0, 1), (1,))
    ds.addSample((1, 0), (1,))
    ds.addSample((1, 1), (0,))
    ds.addSample((0, 0), (0,))
    ds.addSample((0, 1), (1,))
    ds.addSample((1, 0), (1,))
    ds.addSample((1, 1), (0,))
    ds.addSample((0, 0), (0,))
    ds.addSample((0, 1), (1,))
    ds.addSample((1, 0), (1,))
    ds.addSample((1, 1), (0,))
    
    trainer = BackpropTrainer(net, ds, learningrate=0.001, momentum=0.99)
    
    trainer.trainUntilConvergence(verbose=True)
    
    print net.activate([0,0])
    print net.activate([0,1])
    print net.activate([1,0])
    print net.activate([1,1])
    
  5. from https://stackoverflow.com/questions/12050460/neural-network-training-with-pybrain-wont-converge by cc-by-sa and MIT license