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): # 가중치 매개변수의 기울기를 구함 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 = {} 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): 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 q: 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) # 保存梯度的字典型变量(numerical_gradient()方法的返回值)。 grads = {} grads['W1'] = numerical_gradient(loss_W, self.params['W1']) # grads['W1']是第1 层权重的梯度 grads['b1'] = numerical_gradient(loss_W, self.params['b1']) # grads['b1']是第1 层偏置的梯度。 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): 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): 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) 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"])
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) #무슨 코드인지 확인 필요 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): # 重みパラメータに対する勾配を求める method を定義 cf.p.104 loss_W = lambda W: self.loss(x, t) # loss_W を定義 cf.p.112 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) grad_W = [np.array([])] for i in range(1, len(self.W)): grad_W.append(numerical_gradient(loss_W, self.W[i])) grad_b = [np.array([])] for i in range(1, len(self.b)): grad_b.append(numerical_gradient(loss_W, self.b[i])) return grad_W, grad_b
def numerical_gradient(self, x, t): def loss_W(W): return self.loss(x, t) grads = {} for i in range(1, len(self.layer_size)): grads['W{}'.format(i)] = numerical_gradient( loss_W, self.params['W{}'.format(i)]) grads['b{}'.format(i)] = numerical_gradient( loss_W, self.params['b{}'.format(i)]) return grads
def numerical_gradient(self, x, t): loss_W = lambda W: self.loss(x, t) grads = {} print("start numerical_gradient W1") grads['W1'] = numerical_gradient(loss_W, self.params['W1']) print("start numerical_gradient b1") grads['b1'] = numerical_gradient(loss_W, self.params['b1']) print("start numerical_gradient W2") grads['W2'] = numerical_gradient(loss_W, self.params['W2']) print("start numerical_gradient b2") grads['b2'] = numerical_gradient(loss_W, self.params['b2']) return grads
def numerical_gradient(self, x, t): def loss_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) #重みパラメータに対する勾配 #lamba式 grads={} #dL/dW: 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 내의 predict를 통해서 예상치를 구함. 예상치와 실제 값을 통해서 cross-entropy 계산. 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) # 학습 수행 시, 편미분 결과에 대해 저장하는 dict 자료형 선언 grads = {} # 각 변수별로 기울기를 구하고 저장함 (key:value pair) 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): u""" 重みパラメータに対する勾配を求める """ 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 = {} # 클래스 내 자가 호출 시 self 를 해야하기 때문에 역으로 보면 같은 이름이라도 self 로 호출하지 않는한 자신의 함수가 아닌걸로 # 판단하기 때문에 numerical_gradient 함수는 외부 함수로 인식 한다. grads['W1'] = numerical_gradient(loss_W, self.param['W1']) grads['B1'] = numerical_gradient(loss_W, self.param['B1']) grads['W2'] = numerical_gradient(loss_W, self.param['W2']) grads['B2'] = numerical_gradient(loss_W, self.param['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
def numerical_gradient(self, x, t): # 현재 입력 관점에서 손실함수를 계산함 (순전파 수행) loss_W = lambda W: self.loss(x, t) # 경사 하강법을 이용하여 weight, bias를 갱신함 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): """ :param x:输入数据 :param t:监督数据 :return: """ 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']) # 1층의 가중치의 기울기 grads['b1'] = numerical_gradient(loss_W, self.params['b1']) # 1층의 편향의 기울기 grads['W2'] = numerical_gradient(loss_W, self.params['W2']) # 2층의 가중치의 기울기 grads['b2'] = numerical_gradient(loss_W, self.params['b2']) # 2층의 편향의 기울기 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']) # 1번째 층의 가중치의 기울기 grads['b1'] = numerical_gradient(loss_W, self.params['b1']) # 1번째 층의 편향의 기울기 grads['W2'] = numerical_gradient(loss_W, self.params['W2']) # 2번째 층의 가중치의 기울기 grads['b2'] = numerical_gradient(loss_W, self.params['b2']) # 2번째 층의 편향의 기울기 return grads # params 변수에 대응하는 각 매개변수의 기울기가 저장됨.
def numerical_gradient(self, x, t): """ 数値微分による重みパラメータに対する勾配算出 :param x: 入力データ :param t: 教師データ :return: """ 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): """ :param x: input number :param t: label :return: gradient """ loss_W = lambda W: self.loss(x, t) # print(t.shape) 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 = {} # 기울기 보관하는 딕셔너리 변수 # 1번째 층의 가중치의 기울기 grads['W1'] = numerical_gradient(loss_W, self.params['W1']) # 1번째 층의 편향 기울기 grads['b1'] = numerical_gradient(loss_W, self.params['b1']) # 2번째 층의 가중치의 기울기 grads['W2'] = numerical_gradient(loss_W, self.params['W2']) # 2번째 층의 편향 기울기 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']) # 1層目の重みの勾配 grads['b1'] = numerical_gradient(loss_W, self.params['b1']) # 1層目のバイアスの勾配 grads['W2'] = numerical_gradient(loss_W, self.params['W2']) # 2層目の重みの勾配 grads['b2'] = numerical_gradient(loss_W, self.params['b2']) # 2層目のバイアスの勾配 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 ------- 각 층의 기울기를 담은 사전(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 (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 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) result = np.argmax(p) # 최댓값의 인덱스 print(result) t = np.array([0, 0, 1]) #정답 레이블 result = net.loss(x, t) print(result) # def f(W): # return net.loss(x, t) f = lambda w: net.loss(x, t) dW = numerical_gradient(f, net.W) print(dW)