@@ -565,8 +565,8 @@ def nnCostFunction(nn_params,input_layer_size,hidden_layer_size,num_labels,X,y,L
565565# 梯度
566566def nnGradient(nn_params,input_layer_size,hidden_layer_size,num_labels,X,y,Lambda):
567567 length = nn_params.shape[0]
568- Theta1 = nn_params[0:hidden_layer_size*(input_layer_size+1)].reshape(hidden_layer_size,input_layer_size+1)
569- Theta2 = nn_params[hidden_layer_size*(input_layer_size+1):length].reshape(num_labels,hidden_layer_size+1)
568+ Theta1 = nn_params[0:hidden_layer_size*(input_layer_size+1)].reshape(hidden_layer_size,input_layer_size+1).copy() # 这里使用copy函数,否则下面修改Theta的值,nn_params也会一起修改
569+ Theta2 = nn_params[hidden_layer_size*(input_layer_size+1):length].reshape(num_labels,hidden_layer_size+1).copy()
570570 m = X.shape[0]
571571 class_y = np.zeros((m,num_labels)) # 数据的y对应0-9,需要映射为0/1的关系
572572 # 映射y
@@ -581,9 +581,8 @@ def nnGradient(nn_params,input_layer_size,hidden_layer_size,num_labels,X,y,Lambd
581581
582582 Theta1_grad = np.zeros((Theta1.shape)) #第一层到第二层的权重
583583 Theta2_grad = np.zeros((Theta2.shape)) #第二层到第三层的权重
584-
585- Theta1[:,0] = 0;
586- Theta2[:,0] = 0;
584+
585+
587586 '''正向传播,每次需要补上一列1的偏置bias'''
588587 a1 = np.hstack((np.ones((m,1)),X))
589588 z2 = np.dot(a1,np.transpose(Theta1))
@@ -592,15 +591,19 @@ def nnGradient(nn_params,input_layer_size,hidden_layer_size,num_labels,X,y,Lambd
592591 z3 = np.dot(a2,np.transpose(Theta2))
593592 h = sigmoid(z3)
594593
594+
595595 '''反向传播,delta为误差,'''
596596 delta3 = np.zeros((m,num_labels))
597597 delta2 = np.zeros((m,hidden_layer_size))
598598 for i in range(m):
599- delta3[i,:] = h[i,:]-class_y[i,:]
599+ #delta3[i,:] = (h[i,:]-class_y[i,:])*sigmoidGradient(z3[i,:]) # 均方误差的误差率
600+ delta3[i,:] = h[i,:]-class_y[i,:] # 交叉熵误差率
600601 Theta2_grad = Theta2_grad+np.dot(np.transpose(delta3[i,:].reshape(1,-1)),a2[i,:].reshape(1,-1))
601602 delta2[i,:] = np.dot(delta3[i,:].reshape(1,-1),Theta2_x)*sigmoidGradient(z2[i,:])
602603 Theta1_grad = Theta1_grad+np.dot(np.transpose(delta2[i,:].reshape(1,-1)),a1[i,:].reshape(1,-1))
603604
605+ Theta1[:,0] = 0
606+ Theta2[:,0] = 0
604607 '''梯度'''
605608 grad = (np.vstack((Theta1_grad.reshape(-1,1),Theta2_grad.reshape(-1,1)))+Lambda*np.vstack((Theta1.reshape(-1,1),Theta2.reshape(-1,1))))/m
606609 return np.ravel(grad)
0 commit comments