質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

0回答

468閲覧

隠れ層の重み勾配が初期値から0になってしまう

oono

総合スコア38

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/11/27 10:31

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)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問