前提・実現したいこと
現在ゼロから学ぶDeepLearningを使用して勉強しています。
その中で、第四章の二層のネットワーク作成で理解できないことがあります。
(過去別の方が質問した際の回答の一部に、さらに質問したいという内容になります。)
二層のネットワークのコード
python
1import sys, os 2sys.path.append(os.pardir) 3from common.functions import * 4from common.gradient import numerical_gradient 5 6class TwoLayerNet: 7 8 def __init__(self, input_size, hidden_size, output_size, weight_init_std = 0.01): 9 """ 10 input_size・・入力層の数 11 hidden_size・・中間層の数 12 output_size・・出力層の数 13 weight_init_std 14 """ 15 16 #重みの初期化 17 self.params = {} 18 self.params['W1'] = weight_init_std * np.random.randn(input_size, hidden_size) 19 self.params['b1'] = np.zeros(hidden_size) 20 self.params['W2'] = weight_init_std * np.random.randn(hidden_size, output_size) 21 self.params['b2'] = np.zeros(output_size) 22 23 24 def predict(self, x): 25 """ 26 入力値をもとに予測をする 27 """ 28 29 W1, W2 = self.params['W1'], self.params['W2'] 30 b1, b2 = self.params['b1'], self.params['b2'] 31 32 a1 = np.dot(x, W1) + b1 33 z1 = sigmoid(a1) 34 a2 = np.dot(z1, W2) + b2 35 y = softmax(a2) 36 return y 37 38 39 def loss(self, x, t): 40 """ 41 損失関数・・どれぐらい教師データと値が違うかを求める 返り値が大きいほど合っていない 42 x・・入力データ 43 t・・教師データ 44 """ 45 y = self.predict(x) 46 return cross_entropy_error(y, t) 47 48 49 def accuracy(self, x, t): 50 """ 51 返り値・・0から1の値 大きいほど入力データからの予測値と、教師データの値が一致している 52 """ 53 y = self.predict(x) 54 y = np.argmax(y, axis=1) 55 t = np.argmax(t, axis=1) 56 57 accuracy = np.sum(y == t) / float(x.shape[0]) 58 return accuracy 59 60 61 def numerical_gradient(self, x, t): 62 """ 63 重みパラメータに対する勾配を求める 64 x・・入力データ 65 t・・教師データ 66 grads・・勾配を保持するディクショナリ変数 67 """ 68 loss_W = lambda W: self.loss(x, t) #loss_Wはloss関数と等しい 69 grads = {} 70 grads['W1'] = numerical_gradient(loss_W, self.params['W1']) 71 grads['b1'] = numerical_gradient(loss_W, self.params['b1']) 72 grads['W2'] = numerical_gradient(loss_W, self.params['W2']) 73 grads['b2'] = numerical_gradient(loss_W, self.params['b2']) 74 return grads
上記の二層ネットワーククラス内で使用しているnumerical_gradientのコード(本に付属しているコード)
python
1def numerical_gradient(f, x): 2 h = 1e-4 # 0.0001 3 grad = np.zeros_like(x) 4 5 it = np.nditer(x, flags=['multi_index'], op_flags=['readwrite']) 6 while not it.finished: 7 idx = it.multi_index 8 tmp_val = x[idx] 9 x[idx] = float(tmp_val) + h 10 fxh1 = f(x) # f(x+h) 11 12 x[idx] = tmp_val - h 13 fxh2 = f(x) # f(x-h) 14 grad[idx] = (fxh1 - fxh2) / (2*h) 15 16 x[idx] = tmp_val # 値を元に戻す 17 it.iternext() 18 19 return grad
理解できない点
以前、別の方からの
「TwoLayerNetクラスのnumerical_gradient関数内で使用されているnumerical_gradient関数は,selfがついていないため、クラスの外側にあるcommon.numerical_gradient関数を使用しているという認識で正しいでしょうか?」
という質問に対し、回答者の方が
「はいそうです。プログラムの先頭部分にfrom common.gradient import numerical_gradient とあるのでcommon以下のgradient.pyに定義されているnumerical_gradientを使用しています。」
と回答されています。
そうすると引数の異なる同名の関数が存在するように思うのですが、一方でpythonはオーバーロードできないという説明を聞きました。
そうすると、上記の「TwoLayerNetクラスのnumerical_gradient関数」と「gradient.pyに定義されているnumerical_gradient関数」はどのような関係のものと思えばいいのでしょうか。
補足情報
以前、別の方がされている質問
https://teratail.com/questions/108865
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/03 14:08