def numerical_gradient(self, X, T): """勾配を求める(数値微分) Parameters ---------- X : 入力データ T : 教師ラベル Returns ------- 各層の勾配を持ったディクショナリ変数 grads['W1']、grads['W2']、...は各層の重み grads['b1']、grads['b2']、...は各層のバイアス """ 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)] = numericalGradient(loss_W, self.params['w' + str(idx)]) grads['b' + str(idx)] = numericalGradient(loss_W, self.params['b' + str(idx)]) if self.use_batchnorm and idx != self.hidden_layer_num+1: grads['gamma' + str(idx)] = numericalGradient(loss_W, self.params['gamma' + str(idx)]) grads['beta' + str(idx)] = numericalGradient(loss_W, self.params['beta' + str(idx)]) return grads
def getNumericalGradient(self, x, t): loss = lambda W: self.getLoss(x, t) gradients = {} gradients['w1'] = numericalGradient(loss, self.params['w1']) gradients['b1'] = numericalGradient(loss, self.params['b1']) gradients['w2'] = numericalGradient(loss, self.params['w2']) gradients['b2'] = numericalGradient(loss, self.params['b2']) return gradients
def getNumericalGradient(self, x, t): wLossFunc = lambda w: self.getLoss(x, t) gradients = {} gradients['w1'] = numericalGradient(wLossFunc, self.params['w1']) gradients['b1'] = numericalGradient(wLossFunc, self.params['b1']) gradients['w2'] = numericalGradient(wLossFunc, self.params['w2']) gradients['b2'] = numericalGradient(wLossFunc, self.params['b2']) return gradients
def gradientDescent(f, initialX, learningRate = 0.01, stepNum = 100): x = initialX for i in range(stepNum): gradient = numericalGradient(f, x) x -= learningRate * gradient return x
def gradientDescent(f, initialX, learningRate=0.01, stepNum=100): x = initialX history = [] for i in range(stepNum): history.append(x.copy()) gradient = numericalGradient(f, x) x -= learningRate * gradient return x, np.array(history)
def numerical_gradient(self, x, t): """勾配を求める(数値微分) Parameters ---------- x : 入力データ t : 教師ラベル Returns ------- 各層の勾配を持ったディクショナリ変数 grads['w1']、grads['w2']、...は各層の重み grads['b1']、grads['b2']、...は各層のバイアス """ loss_w = lambda w: self.loss(x, t) grads = {} for idx in (1, 2, 3): grads['w' + str(idx)] = numericalGradient(loss_w, self.params['w' + str(idx)]) grads['b' + str(idx)] = numericalGradient(loss_w, self.params['b' + str(idx)]) return grads
def numerical_gradient(self, x, t): """勾配を求める(数値微分) Parameters ---------- x : 入力データ t : 教師ラベル Returns ------- 各層の勾配を持ったディクショナリ変数 grads['W1']、grads['W2']、...は各層の重み grads['b1']、grads['b2']、...は各層のバイアス """ loss_W = lambda W: self.loss(x, t) grads = {} for idx in range(1, self.hidden_layer_num+2): grads['w' + str(idx)] = numericalGradient(loss_W, self.params['w' + str(idx)]) grads['b' + str(idx)] = numericalGradient(loss_W, self.params['b' + str(idx)]) return grads
def gradientDescent(f, initX, lr=0.0001, step=100): x = initX for i in range(step): grad = numericalGradient(f, x) x -= x * lr return x
[-0.63929169, 0.59491399, 0.67441589], [-1.4568322, -1.79286679, 0.1717967], ]) def predict(self, x): return np.dot(x, self.w) def loss(self, x, t): y = self.predict(x) y = softmax(y) loss = crossEntropyErrorMB(y, t) print(y) return loss if (__name__ == "__main__"): result = getMnist(True, True, True) net = simpleNet() x = np.array([1.3, 6.0]) t = np.array([0, 0, 1]) net.loss(x, t) def funcNet(w): return net.loss(x, t) for i in range(100): grad = numericalGradient(funcNet, net.w) net.w -= grad * 0.01 # print(grad); print(net.w)
#coding: utf-8 import sys import matplotlib.pylab as plt import numpy as np sys.path.append('../../') from common.gradient import numericalGradient def f(x): return np.sum(x**2) print(numericalGradient(f, np.array([3.0, 4.0]))) print(numericalGradient(f, np.array([0.0, 2.0]))) print(numericalGradient(f, np.array([3.0, 0.0]))) print(numericalGradient(f, np.array([99.0, 100.0, 5.0, 300.0])))
def line(f, x): a = numericalGradient(f, x) y = f(x) - a * x return lambda t: a * t + y
for i in range(stepNum): history.append(x.copy()) gradient = numericalGradient(f, x) x -= learningRate * gradient return x, np.array(history) # gradient x0 = np.arange(-4.0, 4.0, 0.25) x1 = np.arange(-4.0, 4.0, 0.25) x, y = np.meshgrid(x0, x1) x = x.flatten() y = y.flatten() gradient = numericalGradient(f, np.array([x, y])) print(gradient) # history initialX = np.array([-3.0, 4.0]) dummy, history = gradientDescent(f, initialX, 0.1, 100) print(dummy) print(history) # plot plt.figure() plt.quiver(x, y, -gradient[0], -gradient[1], angles="xy",
#coding: utf-8 import sys import numpy as np from SimpleNet import SimpleNet from common.gradient import numericalGradient net = SimpleNet() print(net.w) x = np.array([0.6, 0.9]) p = net.predict(x) print(p) print(np.argmax(p)) # index of max number t = np.array([0, 0, 1]) loss = net.loss(x, t) print(loss) #def f(w): # return net.loss(x, t) #dw = numericalGradient(f, net.w) dw = numericalGradient(lambda w: net.loss(x, t), net.w) print(dw)