我是新来的神经网络。我试图写简单的4-0-2 MLP和学习反向传播算法在实践中。但我的反向传播总是发散,输出总是[1,1]。我寻找可能的原因,但无论是将学习率设置为很小的数字(0.001),还是更改delta权重符号,都无法解决这个问题。
反向传播算法代码:

def backward(self,trainingSamples):
    for i in range(len(trainingSamples)):
        curr_sample=trainingSamples[i]
        self.input=curr_sample[0]
        self.forward()
        print("output is "+str(self.output))
        curr_des_out=curr_sample[1]
        for i in range(len(self.outputs)):
            error=curr_des_out[i]-self.outputs[i].output
            der_act=self.outputs[i].activate(deriv=True)
            local_gradient=der_act*error
            for j in range(len(self.input)):
                self.weights[j][i]-=self.learning_rate*local_gradient*self.input[j]

trainingSamples是数组的元组的元组:( ([1,1,1,1],[1,0]), ([0,0,0,0],[0,1]),([1,0,0,0],[0,1]), ([1,0,1,0],[1,0]) )
这是远期通行证代码:
def forward(self):
    for i in range(len(self.outputs)):
        for j in range(len(self.input)):
            self.outputs[i].input+=self.input[j]*self.weights[j][i]
        self.outputs[i].activate()
        self.output[i]=self.outputs[i].output
    return self.output

最佳答案

尽管我看不到代码的完整实现(比如.activate(),等等),但我想我知道你是如何实现它们的。如果你已经正确地实现了它们,我认为你的代码有一个问题会清楚地显示出分歧。
问题-或者至少其中一个问题-似乎是你没有重置你的神经元的输入(树突):

def forward(self):
    for i in range(len(self.outputs)):
        self.outputs[i].input = 0
        for j in range(len(self.input)):
            self.outputs[i].input+=self.input[j]*self.weights[j][i]
        self.outputs[i].activate()
        self.output[i]=self.outputs[i].output
    return self.output

因为你不断增加输入,我怀疑你最终会得到输出[1,1],因为sigmoid函数会随着输入变为无穷大而变为1。

关于python - 反向传播算法无法正常工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41837181/

10-10 17:04