M.L (p.134)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
import numpy as np from p88func import * class simpleNet: def __init__(self): self.W = np.random.randn(2,3) 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) print(np.argmax(p)) t= np.array([0,0,1]) d = net.loss(x,t) print(d) def f(W): return net.loss(x,t) dW = numerical_gradient(f,net.W) print(dW) |
(2,3) 같은 다차원배열일 경우의 기울기를 구한다.
simpleNet은 입력 값 x와 normal distribution로 초기화한 W 값(가중치) 를 행렬곱하여 (xW) 그 값을 softmax 값으로 변환하고 정답레이블(t)와 비교하여 cross_entropy_error를 구한 값을 반환한다.
![]()
normal distribution으로 초기화한 (2,3)의 W(가중치) 를 나타낸다. 다음 x의 값 [0.6, 0.9] 값을 입력받는다. x와 초기화된 W의 행렬곱으로 반환된 값은
x(2, ) W (2,3) x●W x(transpose)W (1,2)*(2,3) = (1,3) 값(3, ) 인 세개 값 출력
argmax로 최대 값 인덱스(여기선 [0] 값)를 찾고 정답레이블t = [0, 0, 1]과 비교하여 cross_entropy_error를 구한다.
cross_entropy_error 값 (입력[0]과 정답[2]의 loss 값)
def f(W) 함수는 loss 값을 정의한 식이다.
마지막으로 numerical_gradient는 그 손실 값을 정의한 식과 배열 인덱스에 해당하는 값들의 편미분을 구해주는 함수로
각각의 배열 인덱스 값들이 손실 값에 얼마나 영향을 미치는지 알려준다. 예로 [0, 0]인덱스 ( -0.3342)값은 W[0,0]값이 아주 조금 변할때 손실값은 단위당 -0.3342변하는 것을 알려준다.
W[0,0] 은 양의 방향으로 W[1,2](마지막 값)은 음의 방향으로 갱신하여 최적 값인 0으로 수렴해가야 함을 알 수 있다.