2015-09-18 15 views
6

ben birlikte aşağıdaki kodu vurmak başardı: O XOR fonksiyonu öğrenmek gerekiyorduBasit 3 katmanlı sinir ağı nasıl oluşturulur ve denetimli öğrenmeyi kullanarak nasıl öğretilir? <a href="http://pybrain.org/docs/index.html#tutorials" rel="nofollow">PyBrain's tutorials</a> dayanarak

#!/usr/bin/env python2 
# coding: utf-8 

from pybrain.structure import FeedForwardNetwork, LinearLayer, SigmoidLayer, FullConnection 
from pybrain.datasets import SupervisedDataSet 
from pybrain.supervised.trainers import BackpropTrainer 

n = FeedForwardNetwork() 

inLayer = LinearLayer(2) 
hiddenLayer = SigmoidLayer(3) 
outLayer = LinearLayer(1) 

n.addInputModule(inLayer) 
n.addModule(hiddenLayer) 
n.addOutputModule(outLayer) 

in_to_hidden = FullConnection(inLayer, hiddenLayer) 
hidden_to_out = FullConnection(hiddenLayer, outLayer) 

n.addConnection(in_to_hidden) 
n.addConnection(hidden_to_out) 

n.sortModules() 

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

trainer = BackpropTrainer(n, ds) 
# trainer.train() 
trainer.trainUntilConvergence() 

print n.activate([0, 0])[0] 
print n.activate([0, 1])[0] 
print n.activate([1, 0])[0] 
print n.activate([1, 1])[0] 

, ancak sonuçlar oldukça rastgele görünüyor:

0,208884929522

0,168926515771

0.459452834043

0,424209192223

veya

0,84956138664

0,888512762786

0,564964077401

0,611111147862

cevap

8

Yeniden senin yaklaşımla dört sorunlar, tüm kolay Neural Network FAQ okuduktan sonra tanımlamak için:

  • Why use a bias/threshold?: Bir önyargı düğümünü eklemek gerekir. Önyargı eksikliği, öğrenmeyi çok sınırlandırmaktadır: ağ tarafından temsil edilen ayırıcı hiperdüze, yalnızca kökeni geçebilir. önyargı düğümü ile, serbestçe hareket ve daha iyi veriler sığabilecek:

    bias = BiasUnit() 
    n.addModule(bias) 
    
    bias_to_hidden = FullConnection(bias, hiddenLayer) 
    n.addConnection(bias_to_hidden) 
    
  • Why not code binary inputs as 0 and 1?: Tüm numuneler numune alan tek kadranda yatıyordu. Onları kökenli dağılmış olması Taşı:

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

    (buna göre komut sonunda doğrulama kodunu sabitleyin.)

  • trainUntilConvergence yöntem doğrulamayı çalışır ve early stopping method benzer bir şey yapar . Bu küçük bir veri kümesi için mantıklı değil. Bunun yerine trainEpochs kullanın. 1000 dönemini öğrenmek için ağ için bu sorun için fazlasıyla yeterli:

    trainer.trainEpochs(1000) 
    
  • What learning rate should be used for backprop?: Ayarlama öğrenme hızı parametresi. Bu, sinir ağını her kullandığınızda yaptığınız bir şey.

    trainer = BackpropTrainer(n, dataset=ds, learningrate=0.1, verbose=True) 
    

    (zaman ayar parametreleri esastır nasıl hata davranır gözlemlemek verbose=True parametreyi Not:. Bu durumda, değer 0.1 hatta 0.2 dramatik öğrenme hızını artırır.) Belirli bir veri kümesinde ile verilen ağ ve 1e-23 daha az hata için bu ı tutarlı olsun düzeltmeleri ve doğru sonuçlarla

.

+0

Ağ, ortalama hata, gerekenden daha düşük (veya eşit) olana kadar ya da çağların sayısına ulaşma sınırına ulaşılıncaya kadar herhangi bir yöntem var mı? – Luke

+0

@Luke PyBrain'in dokümanları dürüstçe "Bu dokümantasyonda mevcut yöntemlerden oluşan bir öznel alıntıdan ibaret" olduğunu belirtiyor. Dolayısıyla, belirli PyBrain dağıtımınızın uygulanmasına bakmanız gerekecektir. Fakat olmasa bile, bu döngüyü kendiniz uygulamak çok kolaydır. – BartoszKP

İlgili konular