尽管初始化一致,但Pybrain神经网络的输出略有不同?

时间:2016-02-08 14:54:24

标签: machine-learning neural-network pybrain

我正在开发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

1 个答案:

答案 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)

如果您想要可重复的结果 - 播种随机数生成器