【问题标题】:Slightly differing output from Pybrain neural network despite consistent initialisation?尽管初始化一致,但 Pybrain 神经网络的输出略有不同?
【发布时间】:2016-02-08 14:54:24
【问题描述】:

我正在研究 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

【问题讨论】:

    标签: machine-learning neural-network pybrain


    【解决方案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)
    

    如果您想要可重复的结果 - 为您的随机数生成器提供种子

    【讨论】:

    • 有道理,谢谢。尽管我已按照您的建议尝试过此操作,但仍然不一致。我现在使用random.seed(42) 为随机数生成器播种,当我打印网络权重时,每次运行网络时它们都是相同的,但预测的输出仍然不同。
    猜你喜欢
    • 2016-01-19
    • 1970-01-01
    • 2019-09-07
    • 2018-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-08
    • 1970-01-01
    相关资源
    最近更新 更多