MNISTをImportして、学習プログラムを作ろうとしています。入力層、隠れ層(1層以上)、出力層の構造において各層重みとバイアスの勾配を求めるプログラムを作りました。隠れ層一層目の重みの損失に対する勾配が初期値で0になってしまいます。
何故でしょうか?
Python
1# -*- coding: utf-8 -*- 2import numpy as np 3from dataset.mnist import load_mnist 4 5def sigmoid(X): 6 y=1/(1+np.exp(-X)) 7 return y 8def relu(X): 9 y=np.maximum(0,X) 10 return y 11def softmax(X): 12 c=np.max(X) 13 y=np.exp(X-c)/np.sum(np.exp(X-c)) 14 return y 15def cee(y,z): 16 delta=1e-7 17 loss=-np.sum(z*np.log(y+delta)) 18 return loss 19def num_gradient(f,X): 20 h=1e-4 21 grad=np.zeros(X.shape) 22 for r in range(0,X.shape[0],1): 23 for idx in range(0,X.shape[1],1): 24 temp_val=X[r,idx] 25 X[r,idx]=temp_val+h 26 fxh1=f(X[r,:])/(2*h) 27 X[r,idx]=temp_val-h 28 fxh2=f(X[r,:])/(2*h) 29 grad[r,idx]=(fxh1-fxh2) 30 X[r,idx]=temp_val 31 return grad 32 33class N_net_train: 34 def __init__(self,x,ln,af,afo): 35 self.ln=ln 36 self.W={} 37 self.b={} 38 shape_now=x.shape 39 for n in range(0,len(self.ln),1): 40 wn="W"+str(n+1) 41 bn="b"+str(n+1) 42 self.W[wn]=np.random.randn(shape_now[1],self.ln[n]) 43 self.b[bn]=np.zeros((1,self.ln[n])) 44 shape_now=(shape_now[1],self.ln[n],) 45 self.af=af 46 self.afo=afo 47 def hidden_layer(self,x): 48 def hidden_layer_n(p,n): 49 a=np.dot(p,list(self.W.values())[n])+list(self.b.values())[n] 50 z=self.af(a) 51 return z 52 z=x 53 for i in range(0,len(self.ln)-1,1): 54 z=hidden_layer_n(p=z,n=i) 55 self.z=z 56 return z 57 def output_layer(self,x): 58 z=self.hidden_layer(x) 59 n=len(self.ln)-1 60 a_out=np.dot(z,list(self.W.values())[n])+list(self.b.values())[n] 61 a_out=self.afo(a_out) 62 self.y=a_out 63 return a_out 64 def score(self,x,t): 65 y=self.output_layer(x) 66 t_max=np.argmax(t,1) 67 y_max=np.argmax(y,1) 68 accuracy=np.sum(t_max==y_max)/float(y.shape[0]) 69 self.accuracy=accuracy 70 return accuracy 71 def error(self,x,t): 72 y=self.output_layer(x) 73 loss=cee(y,t)/float(t.shape[0]) 74 self.loss=loss 75 return loss 76 def gradient(self,x,t): 77 grads_W={} 78 grads_b={} 79 loss_W=lambda M:self.error(x,t) 80 for n in range(0,len(self.ln),1): 81 wn="W"+str(n+1) 82 bn="b"+str(n+1) 83 dW=num_gradient(f=loss_W,X=list(self.W.values())[n]) 84 db=num_gradient(f=loss_W,X=list(self.b.values())[n]) 85 grads_W[wn]=dW 86 grads_b[bn]=db 87 self.grads_W=grads_W 88 self.grads_b=grads_b 89 return grads_W,grads_b 90 91if __name__ == "__main__": 92 93 (x_train,t_train),(x_test,t_test)=\ 94 load_mnist(normalize=True,flatten=True,one_hot_label=True) 95 inp,true=(x_train,t_train) 96 inp=inp[:100,:] 97 true=true[:100,:] 98 num_neurons=[50,10] 99 100 activate_f=sigmoid 101 activate_f_out=softmax 102 103 nn=N_net_train(x=inp,ln=num_neurons,af=activate_f,afo=activate_f_out) 104 nn.score(x=inp,t=true) 105 nn.error(x=inp,t=true) 106 print("Accuracy:",nn.accuracy) 107 print("Loss:",nn.loss) 108 109 nn=N_net_train(x=inp,ln=num_neurons,af=activate_f,afo=activate_f_out) 110 nn.gradient(x=inp,t=true) 111 112 print("\n重み勾配配列") 113 print(nn.grads_W) 114 print("\nbias勾配配列") 115 print(nn.grads_b)
あなたの回答
tips
プレビュー