2015-09-18 13 views
6

Dựa trên PyBrain's tutorials tôi quản lý để gõ cùng đoạn mã sau:Cách tạo mạng nơron 3 lớp đơn giản và dạy nó bằng cách sử dụng học được giám sát?

#!/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] 

Đó là nghĩa vụ phải học chức năng XOR, nhưng kết quả dường như khá ngẫu nhiên:

0,208884929522

0,168926515771

0.459452834043

0,424209192223

hoặc

0,84956138664

0,888512762786

0,564964077401

0,611111147862

Trả lời

8

Các tái bốn vấn đề với cách tiếp cận của bạn, tất cả dễ dàng để xác định sau khi đọc Neural Network FAQ:

  • Why use a bias/threshold?: bạn nên thêm một nút bias. Thiếu sự thiên vị làm cho việc học tập rất hạn chế: siêu năng lượng được phân tách được đại diện bởi mạng chỉ có thể đi qua gốc. Với nút thiên vị, nó có thể di chuyển tự do và phù hợp với những dữ liệu tốt hơn:

    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ất cả các mẫu của bạn nằm trong một góc phần tư duy nhất của không gian mẫu. Di chuyển họ được rải rác xung quanh nguồn gốc:

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

    (Fix mã xác nhận vào cuối kịch bản của bạn cho phù hợp.)

  • trainUntilConvergence phương pháp công trình sử dụng xác nhận, và làm việc gì đó tương tự như early stopping method . Điều này không có ý nghĩa đối với một tập dữ liệu nhỏ như vậy. Sử dụng trainEpochs để thay thế. 1000 thời đại là quá đủ cho vấn đề này cho mạng để tìm hiểu:

    trainer.trainEpochs(1000) 
    
  • What learning rate should be used for backprop?: Tune tham số tỷ lệ học. Đây là điều bạn làm mỗi lần bạn sử dụng mạng thần kinh. Trong trường hợp này, giá trị 0.1 hoặc thậm chí 0.2 tăng đáng kể tốc độ học tập:

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

    (Lưu ý các tham số verbose=True Quan sát cách cư xử lỗi là điều cần thiết khi điều chỉnh các thông số..)

Với các bản sửa lỗi tôi nhận được nhất quán, và kết quả chính xác cho các mạng đưa ra với các tập dữ liệu nhất định, và lỗi ít hơn 1e-23.

+0

Có phương pháp nào để đào tạo mạng cho đến khi sai số trung bình thấp hơn (hoặc bằng) so với yêu cầu hoặc giới hạn số lượng kỷ nguyên đã đạt được không? – Luke

+0

@Luke PyBrain của tài liệu thành thật nói rằng "Tài liệu này chỉ bao gồm một trích đoạn chủ quan của các phương pháp có sẵn". Vì vậy, bạn sẽ cần phải xem xét việc thực hiện phân phối PyBrain cụ thể của bạn. Nhưng ngay cả khi không có, nó rất dễ dàng để thực hiện vòng lặp như vậy của chính mình. – BartoszKP

Các vấn đề liên quan