def numerical_gradient(self, X, T): """기울기를 구한다(수치 미분). Parameters ---------- x : 입력 데이터 t : 정답 레이블 Returns ------- 각 층의 기울기를 담은 사전(dictionary) 변수 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)] = 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
def numericalGradient(self, x, t): lossW = lambda W: self.loss(x, t) grads = {} grads['W1'] = numerical_gradient(lossW, self.params['W1']) grads['W2'] = numerical_gradient(lossW, self.params['W2']) grads['b1'] = numerical_gradient(lossW, self.params['b1']) grads['b2'] = numerical_gradient(lossW, self.params['b2']) return grads
def numerical_gradient(self, x, y_label): def loss_W(W): return self.loss(x, y_label) 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): """기울기를 구한다(수치미분). Parameters ---------- x : 입력 데이터 t : 정답 레이블 Returns ------- 각 층의 기울기를 담은 사전(dictionary) 변수 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)] = 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): """기울기를 구한다(수치 미분). Parameters ---------- x : 입력 데이터 t : 정답 레이블 Returns ------- 각 층의 기울기를 담은 딕셔너리(dictionary) 변수 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)] = numerical_gradient( loss_W, self.params['W' + str(idx)]) grads['b' + str(idx)] = numerical_gradient( loss_W, self.params['b' + str(idx)]) return grads
#%% ''' Run the simpleNet ''' x = np.array([0.6, 0.9]) y_label = np.array([0, 0, 1]) net = simpleNet() print(net.W) y_predict = net.predict(x) print(y_predict) print(net.loss(x, y_label)) #%% ''' Run Gradient Descent: Every run by the numerical_gradient function would change the value of W which would affect the output of net.loss(x, y_label) ''' def f(w): return net.loss(x, y_label) dw = numerical_gradient(f, net.W) # print(dw)
y = softmax(z) return y def loss(self, x, t): y = self.predict(x) loss = cross_entropy_error(y, t) return loss simpleNet = SimpleNet() x = np.array([0.6, 0.9]) t = np.array([0, 0, 1]) print("input values:", x) print("initialized weight:\n", simpleNet.W) print("labeled values:", t) print("neuralnet output:", simpleNet.predict(x)) print("cost(loss) :", simpleNet.loss(x, t)) def f(w): #w는 dummy return simpleNet.loss(x, t) ''' numerical_gradient(f,x)에서 f는 손실함수, x는 손실함수 f의 인수 즉, simpleNet.W[0,0], [0,1], [0,2], [1,0], [1,1], [1,2] 의 값으로 손실함수를 편미분한 결과 (Gradient) ''' gradient = numerical_gradient(f, simpleNet.W) print("gradient:\n", gradient)