我正在尝试根据给定的事实重新创建一个神经网络。它有 3 个输入、一个隐藏层和一个输出。我的问题是权重也给定了,所以我不需要训练。
我在想也许我可以保存结构相似的神经网络的训练并相应地更改值。你认为这行得通吗?任何其他想法。谢谢。
神经网络代码:
net = FeedForwardNetwork()
inp = LinearLayer(3)
h1 = SigmoidLayer(1)
outp = LinearLayer(1)
# add modules
net.addOutputModule(outp)
net.addInputModule(inp)
net.addModule(h1)
# create connections
net.addConnection(FullConnection(inp, h1))
net.addConnection(FullConnection(h1, outp))
# finish up
net.sortModules()
trainer = BackpropTrainer(net, ds)
trainer.trainUntilConvergence()
保存训练并从 How to save and recover PyBrain training? 加载代码
# Using NetworkWriter
from pybrain.tools.shortcuts import buildNetwork
from pybrain.tools.xml.networkwriter import NetworkWriter
from pybrain.tools.xml.networkreader import NetworkReader
net = buildNetwork(2,4,1)
NetworkWriter.writeToFile(net, 'filename.xml')
net = NetworkReader.readFrom('filename.xml')
最佳答案
我很好奇读取已经训练好的网络(使用 xml 工具)是如何完成的。因为,这意味着可以以某种方式设置网络权重。所以在 NetworkReader documentation我发现,您可以使用 _setParameters()
设置参数。
然而,下划线表示私有(private)方法,它可能有一些潜在的副作用。还要记住,带有权重的向量必须与最初构建的网络长度相同。
例子
>>> import numpy
>>> from pybrain.tools.shortcuts import buildNetwork
>>> net = buildNetwork(2,3,1)
>>> net.params
array([...some random values...])
>>> len(net.params)
13
>>> new_params = numpy.array([1.0]*13)
>>> net._setParameters(new_params)
>>> net.params
array([1.0, ..., 1.0])
另一件重要的事情是将值(value)观按正确的顺序排列。比如上面是这样的:
[ 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1. ]
input->hidden0 hidden0->out bias->out bias->hidden0
要确定哪些权重属于层之间的哪些连接,试试这个
# net is our neural network from previous example
for c in [connection for connections in net.connections.values() for connection in connections]:
print("{} -> {} => {}".format(c.inmod.name, c.outmod.name, c.params))
无论如何,我仍然不知道层与层之间权重的确切顺序...
关于python - PyBrain:如何在神经网络中放置特定的权重?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9549868/