#わからないこと
TwoLayerNetにあるgradientメソッドのforwardについて
#TwoLayerNetのコード
python
1# coding: utf-8 2import sys, os 3sys.path.append(os.pardir) # 親ディレクトリのファイルをインポートするための設定 4import numpy as np 5from common.layers import * 6from common.gradient import numerical_gradient 7from collections import OrderedDict 8 9 10class TwoLayerNet: 11 12 def __init__(self, input_size, hidden_size, output_size, weight_init_std = 0.01): 13 # 重みの初期化 14 self.params = {} 15 self.params['W1'] = weight_init_std * np.random.randn(input_size, hidden_size) 16 self.params['b1'] = np.zeros(hidden_size) 17 self.params['W2'] = weight_init_std * np.random.randn(hidden_size, output_size) 18 self.params['b2'] = np.zeros(output_size) 19 20 # レイヤの生成 21 self.layers = OrderedDict() 22 self.layers['Affine1'] = Affine(self.params['W1'], self.params['b1']) 23 self.layers['Relu1'] = Relu() 24 self.layers['Affine2'] = Affine(self.params['W2'], self.params['b2']) 25 26 self.lastLayer = SoftmaxWithLoss() 27 28 def predict(self, x): 29 for layer in self.layers.values(): 30 x = layer.forward(x) 31 32 return x 33 34 # x:入力データ, t:教師データ 35 def loss(self, x, t): 36 y = self.predict(x) 37 return self.lastLayer.forward(y, t) 38 39 def accuracy(self, x, t): 40 y = self.predict(x) 41 y = np.argmax(y, axis=1) 42 if t.ndim != 1 : t = np.argmax(t, axis=1) 43 44 accuracy = np.sum(y == t) / float(x.shape[0]) 45 return accuracy 46 47 # x:入力データ, t:教師データ 48 def numerical_gradient(self, x, t): 49 loss_W = lambda W: self.loss(x, t) 50 51 grads = {} 52 grads['W1'] = numerical_gradient(loss_W, self.params['W1']) 53 grads['b1'] = numerical_gradient(loss_W, self.params['b1']) 54 grads['W2'] = numerical_gradient(loss_W, self.params['W2']) 55 grads['b2'] = numerical_gradient(loss_W, self.params['b2']) 56 57 return grads 58 59 def gradient(self, x, t): 60 # forward 61 self.loss(x, t) 62 63 # backward 64 dout = 1 65 dout = self.lastLayer.backward(dout) 66 67 layers = list(self.layers.values()) 68 layers.reverse() 69 for layer in layers: 70 dout = layer.backward(dout) 71 72 # 設定 73 grads = {} 74 grads['W1'], grads['b1'] = self.layers['Affine1'].dW, self.layers['Affine1'].db 75 grads['W2'], grads['b2'] = self.layers['Affine2'].dW, self.layers['Affine2'].db 76 77 return grads
#gradient
python
1def gradient(self, x, t): 2 # forward 3 self.loss(x, t) 4 5 # backward 6 dout = 1 7 dout = self.lastLayer.backward(dout) 8 9 layers = list(self.layers.values()) 10 layers.reverse() 11 for layer in layers: 12 dout = layer.backward(dout) 13 14 # 設定 15 grads = {} 16 grads['W1'], grads['b1'] = self.layers['Affine1'].dW, self.layers['Affine1'].db 17 grads['W2'], grads['b2'] = self.layers['Affine2'].dW, self.layers['Affine2'].db 18 19 return grads
ここのforwardでself.loss(x, t)は変数に渡されていないのですが、これはどのような動作をしているのですか?
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。