2017-01-24 27 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:也許你更好[編輯](http://stackoverflow.com/posts/41837181/edit)它在你的問題。 –

+0

@ WillemVanOnsem,done –

回答

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

因爲你不斷遞增輸入,我懷疑,確實由於sigmoid函數在輸入變爲無窮大時變爲1,因此最終輸出爲[1,1]

+0

我使用sigmoid作爲激活函數。 –

+0

@david_I:是的,但我認爲sigmoid不會清除會話的輸入? –

+0

感謝您的幫助!它正在工作! –