オライリー・ジャパンの「ゼロから作る Deep Learning」という本についての質問です。
疑問は、p.114の以下のコードについてです。
import sys, os sys.path.append(os.pardir) from common.functions import * from common.gradient import numerical_gradient class TwoLayerNet: def __init__(self, input_size, hidden_size, output_size, weight_init_std = 0.01): """ input_size・・入力層の数 hidden_size・・中間層の数 output_size・・出力層の数 weight_init_std """ #重みの初期化 self.params = {} self.params['W1'] = weight_init_std * np.random.randn(input_size, hidden_size) self.params['b1'] = np.zeros(hidden_size) self.params['W2'] = weight_init_std * np.random.randn(hidden_size, output_size) self.params['b2'] = np.zeros(output_size) def predict(self, x): """ 入力値をもとに予測をする """ W1, W2 = self.params['W1'], self.params['W2'] b1, b2 = self.params['b1'], self.params['b2'] a1 = np.dot(x, W1) + b1 z1 = sigmoid(a1) a2 = np.dot(z1, W2) + b2 y = softmax(a2) return y def loss(self, x, t): """ 損失関数・・どれぐらい教師データと値が違うかを求める 返り値が大きいほど合っていない x・・入力データ t・・教師データ """ y = self.predict(x) return cross_entropy_error(y, t) def accuracy(self, x, t): """ 返り値・・0から1の値 大きいほど入力データからの予測値と、教師データの値が一致している """ y = self.predict(x) y = np.argmax(y, axis=1) t = np.argmax(t, axis=1) accuracy = np.sum(y == t) / float(x.shape[0]) return accuracy def numerical_gradient(self, x, t): """ 重みパラメータに対する勾配を求める x・・入力データ t・・教師データ grads・・勾配を保持するディクショナリ変数 """ loss_W = lambda W: self.loss(x, t) #loss_Wはloss関数と等しい grads = {} grads['W1'] = numerical_gradient(loss_W, self.params['W1']) grads['b1'] = numerical_gradient(loss_W, self.params['b1']) grads['W2'] = numerical_gradient(loss_W, self.params['W2']) grads['b2'] = numerical_gradient(loss_W, self.params['b2']) return grads
上記のnumerical_gradientの部分で
loss_W = lambda W: self.loss(x, t)
について、引数としてWを設定している意味が理解できておりません。Wはself.loss(x,t)の中のどの部分に使われているのでしょうか。
初心者的質問で恐縮ですが、どうぞ宜しくお願いします。。
あなたの回答
tips
プレビュー