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
Пример #2
0
 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
Пример #3
0
    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
Пример #4
0
    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
Пример #5
0
    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
Пример #6
0
#%%
'''
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)
Пример #7
0
        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)