Я новичок в нейронных сетях. Я пытался писать простые 4-0-2 MLP и на практике изучать алгоритм распространения. Но мое обратное распространение всегда расходится, и выход всегда [1,1]. Я искал возможную причину, но ни одна установка скорости обучения до довольно небольшого числа (0,001) или изменение знака дельта-веса не могла решить проблему.Обратный алгоритм распространения не работает должным образом
код для алгоритма обратного распространения:
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
Можете ли вы показать, как вы рассчитываете выход? Возможно, что-то не так с форвардом (а также)? (Я не хочу вас обидеть, но чем больше мы можем исключить, тем лучше я думаю). –
@ david_l: возможно, вам лучше [edit] (http://stackoverflow.com/posts/41837181/edit) это в вашем вопросе. –
@ WillemVanOnsem, сделано –