после загрузки из файла (который воссоздает этот общий доступ), и он должен работать.

in это библиотека Python, которая предоставляет (среди прочего) простые в использовании искусственные нейронные сети.

Я не могу правильно сериализовать / десериализовать сети PyBrain, используя pickle или cPickle.

Смотрите следующий пример:

from pybrain.datasets            import SupervisedDataSet
from pybrain.tools.shortcuts     import buildNetwork
from pybrain.supervised.trainers import BackpropTrainer
import cPickle as pickle
import numpy as np 

#generate some data
np.random.seed(93939393)
data = SupervisedDataSet(2, 1)
for x in xrange(10):
    y = x * 3
    z = x + y + 0.2 * np.random.randn()  
    data.addSample((x, y), (z,))

#build a network and train it    

net1 = buildNetwork( data.indim, 2, data.outdim )
trainer1 = BackpropTrainer(net1, dataset=data, verbose=True)
for i in xrange(4):
    trainer1.trainEpochs(1)
    print '\tvalue after %d epochs: %.2f'%(i, net1.activate((1, 4))[0])

Это результат вышеприведенного кода:

Total error: 201.501998476
    value after 0 epochs: 2.79
Total error: 152.487616382
    value after 1 epochs: 5.44
Total error: 120.48092561
    value after 2 epochs: 7.56
Total error: 97.9884043452
    value after 3 epochs: 8.41

Как вы можете видеть, общая ошибка сети уменьшается по мере прохождения обучения. Вы также можете увидеть, что прогнозируемое значение приближается к ожидаемому значению 12.

Теперь мы выполним аналогичное упражнение, но включим сериализацию / десериализацию:

print 'creating net2'
net2 = buildNetwork(data.indim, 2, data.outdim)
trainer2 = BackpropTrainer(net2, dataset=data, verbose=True)
trainer2.trainEpochs(1)
print '\tvalue after %d epochs: %.2f'%(1, net2.activate((1, 4))[0])

#So far, so good. Let's test pickle
pickle.dump(net2, open('testNetwork.dump', 'w'))
net2 = pickle.load(open('testNetwork.dump'))
trainer2 = BackpropTrainer(net2, dataset=data, verbose=True)
print 'loaded net2 using pickle, continue training'
for i in xrange(1, 4):
        trainer2.trainEpochs(1)
        print '\tvalue after %d epochs: %.2f'%(i, net2.activate((1, 4))[0])

Это вывод этого блока:

creating net2
Total error: 176.339378639
    value after 1 epochs: 5.45
loaded net2 using pickle, continue training
Total error: 123.392181859
    value after 1 epochs: 5.45
Total error: 94.2867637623
    value after 2 epochs: 5.45
Total error: 78.076711114
    value after 3 epochs: 5.45

Как вы можете видеть, кажется, что обучение оказывает некоторое влияние на сеть (сообщаемое значение общей ошибки продолжает уменьшаться), однако выходное значение сети замирает на значении, которое было релевантным для первой итерации обучения.

Есть ли какой-нибудь механизм кэширования, о котором мне нужно знать, который вызывает это ошибочное поведение? Существуют ли лучшие способы сериализации / десериализации сетей Pybrain?

Соответствующие номера версий:

Python 2.6.5 (r265: 79096, 19 марта 2010 г., 21:48:26) [MSC v.1500 32 бит (Intel)]Numpy 1.5.1cPickle 1,71Pybrain 0,3

Постскриптум Я создалотчет об ошибке на сайте проекта и будет обновлять как SO, так и трекер ошибокj

Ответы на вопрос(1)

Ваш ответ на вопрос