def numerical_gradient(self, x, t): loss_W = lambda W: self.loss(x, t) grads = {} for idx in range(1, self.hidden_layer_num + 2): grads['W' + str(idx)] = numerical_gradient( loss_W, self.params['W' + str(idx)]) grads['b' + str(idx)] = numerical_gradient( loss_W, self.params['b' + str(idx)]) return grads
def numerical_gradient(self, x, t): loss_W = lambda W: self.loss(x, t) 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
def numerical_gradient(self, X, T): loss_W = lambda W: self.loss(X, T, train_flg=True) grads = {} for idx in range(1, self.hidden_layer_num + 2): grads['W' + str(idx)] = numerical_gradient( loss_W, self.params['W' + str(idx)]) grads['b' + str(idx)] = numerical_gradient( loss_W, self.params['b' + str(idx)]) if self.use_batchnorm and idx != self.hidden_layer_num + 1: grads['gamma' + str(idx)] = numerical_gradient( loss_W, self.params['gamma' + str(idx)]) grads['beta' + str(idx)] = numerical_gradient( loss_W, self.params['beta' + str(idx)]) return grads
class simpleNet: def __init__(self): self.W = np.random.randn(2, 3) def predict(self, x): return np.dot(x, self.W) def loss(self, x, t): z = self.predict(x) y = softmax(z) loss = cross_entropy_error(y, t) return loss net = simpleNet() print(net.W) x = np.array([0.6, 0.9]) p = net.predict(x) print(p) print(np.argmax(p)) t = np.array([0, 0, 1]) print(net.loss(x, t)) f = lambda w: net.loss(x, t) dW = numerical_gradient(f, net.W) print(dW)