PyBrain是一个python库,提供(除其他外)易于使用的人工神经网络。如何序列化/反序列化的pybrain网络?
我无法正确使用pickle或cPickle对PyBrain网络进行序列化/反序列化。
参见下面的示例:
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,2010年3月19日,21时48分26秒)[MSC v.1500 32位(英特尔)]
- numpy的1.5。 1
- cPickle的1.71
- pybrain 0.3
PS我已经在该项目的网站上创建a bug report,将保留两个SO和bug跟踪系统updatedj
您确定在重新加载`net2`后,不应该再次执行`trainer2 = BackpropTrainer(net2,dataset = data,verbose = True)`? – 2010-12-02 13:15:02