2012-09-14 119 views
2

我正在寫一個程序來做python的神經網絡我正在嘗試設置反向傳播算法。基本思想是,我查看5000個訓練樣例並收集錯誤,並找出我需要移動這些theta的方向,然後朝這個方向移動。有訓練的例子,然後我使用一個隱藏層,然後是一個輸出層。但是,我得到的梯度/派生/錯誤在這裏是錯誤的,因爲我不移動正確的thetas,因爲它們需要移動。今天我放了8個小時不知道我做錯了什麼。謝謝你的幫助!!神經網絡的反向傳播 - Python

x = 401x5000 matrix 

y = 10x5000 matrix # 10 possible output classes, so one column will look like [0, 0, 0, 1, 0... 0] to indicate the output class was 4 

theta_1 = 25x401 

theta_2 = 10x26 


alpha=.01 

    sigmoid= lambda theta, x: 1/(1 + np.exp(-(theta*x))) 


     #move thetas in right direction for each iteration 
     for iter in range(0,1): 
      all_delta_1, all_delta_2 = 0, 0 
      #loop through each training example, 1...m  
      for t in range(0,5000): 

       hidden_layer = np.matrix(np.concatenate((np.ones((1,1)),sigmoid(theta_1,x[:,t])))) 
       output_layer = sigmoid(theta_2,hidden_layer) 

       delta_3 = output_layer - y[:,t] 
       delta_2= np.multiply((theta_2.T*delta_3),(np.multiply(hidden_layer,(1-hidden_layer)))) 

       #print type(delta_3), delta_3.shape, type(hidden_layer.T), hidden_layer.T.shape 
       all_delta_2 += delta_3*hidden_layer.T 
       all_delta_1 += delta_2[1:]*x[:,t].T 



      delta_gradient_2 = (all_delta_2/m) 
      delta_gradient_1 = (all_delta_1/m) 
      theta_1 = theta_1- (alpha * delta_gradient_1) 
      theta_2 = theta_2- (alpha * delta_gradient_2) 
+0

感謝編輯攪拌器。 爲了清楚起見,我想補充說我的delta_gradient_2和delta_gradient_1是正確的矩陣大小。只是他們的價值觀不準確。當我將迭代次數增加到20次,並用成本函數測量精度時,成本將下降約20次迭代,然後再次開始恢復。但即使在最低的成本水平,theta的我的算法給出的是不準確的。 – appleLover

回答

0

它看起來像你的梯度是相對於未平滑的輸出層。

嘗試將output_layer = sigmoid(theta_2,hidden_layer)更改爲output_layer = theta_2*hidden_layer

或重新計算壓扁輸出的梯度。

相關問題