我正在开发PyBrain中的前馈网络。为了让我比较不同某些参数的影响我自己初步确定了网络权重。我这样做的假设是,如果权重总是相同,那么输出应该总是相同的。这个假设是不正确的?以下是用于设置网络的代码
n = FeedForwardNetwork()
inLayer = LinearLayer(7, name="in")
hiddenLayer = SigmoidLayer(1, name="hidden")
outLayer = LinearLayer(1, name="out")
n.addInputModule(inLayer)
n.addModule(hiddenLayer)
n.addOutputModule(outLayer)
in_to_hidden = FullConnection(inLayer, hiddenLayer, name="in-to-hidden")
hidden_to_out = FullConnection(hiddenLayer, outLayer, name="hidden-to-out")
n.addConnection(in_to_hidden)
n.addConnection(hidden_to_out)
n.sortModules()
in_to_hidden_params = [
0.27160018, -0.30659429, 0.13443352, 0.4509613,
0.2539234, -0.8756649, 1.25660715
]
hidden_to_out_params = [0.89784474]
net_params = in_to_hidden_params + hidden_to_out_params
n._setParameters(net_params)
trainer = BackpropTrainer(n, ds, learningrate=0.01, momentum=0.8)
即使播种随机数发生器,再现性仍然是一个问题。见the GitHub issue here
答案 0 :(得分:1)
我这样做的假设是,如果权重总是相同,那么输出应该总是相同的
这个假设是正确的,但是你的代码没有这样做。您的训练您的体重,因此它们最终不会相同。随机训练方法通常置换训练样本,这种排列导致不同的结果,特别是BackpropTrainer does so:
def train(self):
"""Train the associated module for one epoch."""
assert len(self.ds) > 0, "Dataset cannot be empty."
self.module.resetDerivatives()
errors = 0
ponderation = 0.
shuffledSequences = []
for seq in self.ds._provideSequences():
shuffledSequences.append(seq)
shuffle(shuffledSequences)
如果您想要可重复的结果 - 播种随机数生成器。