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 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)] = 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 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)] = 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 numerical_gradient(self, x, t): loss_W = lambda W: self.loss(x, t) grads = {} grads['W1'] = numerical_gradient(loss_W, self.params['W1']) grads['W2'] = numerical_gradient(loss_W, self.params['W2']) 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) 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): def loss_W(W): return 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) #入力と正解ラベルのlossを求める無名関数loss_Wの作成 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) grads = { 'W1': numerical_gradient(loss_W, self.params['W1']), 'b1': numerical_gradient(loss_W, self.params['b1']), 'W2': numerical_gradient(loss_W, self.params['W2']), 'b2': numerical_gradient(loss_W, self.params['b2']) } return grads
def numerical_gradient(self, x, t): #가중치 매개변수(w) 기울기 구하기(수치미분) # W = self.loss(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)]) return grads
def numerical_gradient(self, x, t): """ 가중치 매개변수의 기울기를 구한다. """ # lambda를 이용하여 loss(x, t)의 함수 f를 구한다. f = lambda W: self.loss(x, t) # 새 딕셔너리 params에 현재 상태에 대한 Weight값과 bias값의 기울기를 저장한다. params = {} params['W1'] = numerical_gradient(f, self.params['W1']) params['b1'] = numerical_gradient(f, self.params['b1']) params['W2'] = numerical_gradient(f, self.params['W2']) params['b2'] = numerical_gradient(f, self.params['b2']) return params
def numerical_gradient(self, x, t): loss_W = lambda W: self.loss(x, t) print("----------------------") grads = {} grads['W1'] = numerical_gradient( loss_W, self.params['W1']) #再起呼び出しじゃない、他のソースファイルの関数 grads['b1'] = numerical_gradient( loss_W, self.params['b1']) #クラス内の関数を使うときは関数の前にself.や、object名.をつけないといけない。 grads['W2'] = numerical_gradient(loss_W, self.params['W2']) grads['b2'] = numerical_gradient(loss_W, self.params['b2']) return grads
def gradient_descent(f, init_x, lr=0.01, step_num=100): x = init_x for i in range(step_num): grad = numerical_gradient(f, x) x -= lr * grad return x
def numerical_gradient(self, x, t): print('in numerical gradient') loss_W = lambda W: self.loss(x, t) grads = {} print('W1 at numerical gradient') grads['W1'] = numerical_gradient(loss_W, self.params['W1']) print('b1 at numerical gradient') grads['b1'] = numerical_gradient(loss_W, self.params['b1']) print('W2 at numerical gradient') grads['W2'] = numerical_gradient(loss_W, self.params['W2']) print('b2 at numerical gradient') grads['b2'] = numerical_gradient(loss_W, self.params['b2']) print('out numerical gradient') return grads
def numerical_gradient(self, x, t): '''重みパラメータに対する勾配を数値微分によって求める input: x(np.array) : 画像データ t(np.array) : 教師データ output: grads(dict) : 重みパラメータ ''' loss_W = lambda W: self.loss(x, t) grads = {} grads['W1'] = numerical_gradient(loss_W, self.params['W1']) grads['W2'] = numerical_gradient(loss_W, self.params['W2']) grads['b1'] = numerical_gradient(loss_W, self.params['b1']) grads['b2'] = numerical_gradient(loss_W, self.params['b2']) return grads
def numerical_gradient(self, x, t): """ ### 重みパラメータに対する勾配を求める Args: 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 gradient_descent(f, init_x, lr=0.01, step_num=100): x = init_x x_history = [] for i in range(step_num): x_history.append(x.copy()) grad = numerical_gradient(f, x) x -= lr * grad # print('1:', x_history,' 2:', x) return x, np.array(x_history) # x是当前,x_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)] = 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 (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 ------- 具有各层的梯度的字典变量 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
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)] = 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 ------- 具有各层的梯度的字典变量 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
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) np.argmax(p) t = np.array([0, 0, 1]) print("net.loss : ", net.loss(x, t)) def f(W): return net.loss(x, t) dW = numerical_gradient(f, net.W) print(dW)
def loss(self, x, t): z = self.predict(x) y = softmax(z) loss = cross_entropy(y, t) return loss net = simpleNet() print('최초 가중치') print(net.W) x = np.array([0.6, 0.9]) p = net.predict(x) print('최초 예측') print(p) np.argmax(p) # 최댓값 인덱스 t = np.array([0, 0, 1]) net.loss(x, t) dW = numerical_gradient(lambda w: net.loss(x, t), net.W) print('기울기') print(dW) net.W = dW print('경사법 이후 예측') print(net.predict(x))