2017-01-24 2 views
3

Я новичок в нейронных сетях. Я пытался писать простые 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 
+1

Можете ли вы показать, как вы рассчитываете выход? Возможно, что-то не так с форвардом (а также)? (Я не хочу вас обидеть, но чем больше мы можем исключить, тем лучше я думаю). –

+0

@ david_l: возможно, вам лучше [edit] (http://stackoverflow.com/posts/41837181/edit) это в вашем вопросе. –

+0

@ WillemVanOnsem, сделано –

ответ

1

Althoug Я не вижу полной реализации вашего кода (например, .activate(), e tc. Думаю, у меня есть идея, как вы их реализовали. Учитывая, что вы правильно их реализовали, я вижу одну проблему с вашим кодом, которая будет явно показывать расхождение.

Проблемы - или, по крайней мере, одна из проблем - кажется, что вы не сбрасываете вход (дендриты) ваши нейроны:

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], так как сигмоидальная функция переходит в 1, поскольку ее вход идет в бесконечность.

+0

Я использую сигмоид как функцию активации. –

+0

@david_I: да, но я предполагаю, что сигмоид не очищает ввод сессии? –

+0

Спасибо за помощь! Он работает сейчас! –

Смежные вопросы