Deep learning/모델 구현 39

파인튜닝 구현

GPU 머신으로 앞에 전이학습에서 활용한 개미와 벌의 화상을 분류하는 모델을 학습시킨다. 학습한 네트워크의 결합 파라미터를 저장하는 방법과 저장된 파라미터를 로드하는 방법에 대해서 알아보겠다. 파인튜닝 파인튜닝은 출력층 등을 변경한 모델을 학습된 모델을 기반으로 구축한 후 직접 준비한 데이터로 신경망 모델의 결합 파라미터를 학습시키는 방법이다. 결합 파라미터의 초깃값은 학습된 모델의 파라미터를 사용한다. 파인튜닝은 전이학습과는 달리 출력층 및 출력층에 가까운 부분뿐만 아니라 모든 층의 파라미터를 다시 학습시킨다. 다만 일반적으로 입력층에 가까운 부분의 파라미터는 학습률을 작게 설정하고(경우에 따라서는 변화시키지 않고) 출력층에 가까운 부분의 파라미터는 학습률을 크게 설정한다. 전이학습처럼 학습된 모델을 ..

36. Model 클래스

이번에는 모델을 표현하기 위한 Model 클래스를 새로 만든다. Model 클래스는 Layer 클래스의 기능을 이어받으며 시각화 메서드가 하나 추가된다. from dezero import Layer from dezero import utils import dezero.functions as F import dezero.layers as L class Model(Layer): def plot(self,*inputs,to_file='model.png'): y=self.forward(*inputs) return utils.plot_dot_graph(y,verbose=True,to_file=to_file) 이제 다음과 같은 코드를 작성할 수 있다. MLP 클래스 class MLP(Model): def __ini..

35. 매개변수를 모아두는 계층

Parameter 클래스 구현 Parameter 클래스는 Variable 클래스와 똑같은 기능을 갖게 한다. 그래서 다음과 같이 구현한다. class Parameter(Variable): pass Parameter 인스턴스와 Variable 인스턴스는 기능은 같지만 구별할 수는 있다. 이와 같이 Parameter 인스턴스와 Variable 인스턴스를 조합하여 계산할 수 있다. Layer 클래스 구현 Layer 클래스는 매개변수를 유지하고 매개변수를 사용하여 변환을 하는 클래스이다. Layer 클래스의 구현은 다음과 같다. from dezero.core import Parameter class Layer: def __init__(self): self._params=set() def __setattr__(s..

34. 신경망

DeZero의 linear 함수 이와 같이 입력 x와 매개벼수 W사이에서 행렬 곱을 구하고, 거기에 b를 더한다. 이 변환을 선형 변환 혹은 아핀 변환이라고 한다. 오른쪽 그림은 Function 클래스를 상속하여 Linear 클래스를 구현하는 방식이다. 이 방식에서는 중간 결과가 Variale 인스턴스로 보존되지 않기 때문에 순전파 시 사용하던 중간 데이터는 순전파가 끝나는 즉시 삭제된다. def linear_simple(x,W,b=None): t=matmul(x,W) if b is None: return t y= t + b t.data = None return y 인수 x와 W는 Variable 인스턴스 혹은 ndarray 인스턴스라고 가정한다. ndarray 인스턴스라면 matmul 함수(정확하게는 ..

33. 형상 변환 함수, 합계 함수

reshape 함수 구현 class Reshape(Function): def __init__ (self,shape): self.shape=shape def forward(self,x): self.x_shape=x.shape y=x.reshape(self.shape) return y def backward(self,gy): return reshape(gy,self.x_shape) def reshape(x,shape): if x.shape==shape: return as_variable(x) return Reshape(shape)(x) 여기서 reshape(x,shape) 의 x는 ndarray 인스턴스 또는 Variable 인스턴스 중 하나라고 가정한다. 행렬의 전치 class Transpose(Funct..

32. 고차 미분

현재의 DeZero는 미분을 자동으로 계산할 수 있지만 1차 미분 한정이다. 그래서 이번 단계에서는 2차 미분도 자동으로 계산할 수 있도록, 나아가 3차 미분, 4차 미분... 형태의 모든 고차 미분까지 자동으로 계산할 수 있도록 DeZero를 확장할 것이다. 역전파 계산 순전파와 마찬가지로 역전파에도 구체적인 계산 로직이 있다. 하지만 현재의 DeZero는 계산과 관련한 아무런 계산 그래프도 만들지 않는다. 왜냐하면 이 계산에서는 ndarray 인스턴스가 사용되기 때문이다. 만약 역전파를 계산할 때도 '연결'이 만들어진다면 고차 미분을 자동으로 계산할 수 있게 된다. 위 그림은 sin함수의 미분을 구하기 위한 계산 그래프이다. 만약 위와 같은 계산 그래프가 있다면 gx.backward()를 호출하여 g..

31. 함수 최적화(중요)

최적화란 어떤 함수가 주어졌을 때 그 최솟값(또는 최대값)을 반환하는 '입력(함수의 인수)'을 찾는 일이다. 신경망 학습의 목표도 손실 함수의 출력을 최소화하는 매개변수를 찾는 것이니 최적화 문제에 속한다. 로젠블록 함수 이번에는 로젠블록 함수의 출력이 최소가 되는 x0와 x1을 찾을 것이다. 답부터 말하면 (x0,x1)=(1,1)이다. 미분 계산 가장 먼저 로젠블록 함수의 (x0,x1)=(0.0, 2.0)에서의 미분을 계산해 보자. def rosenbrock(x0,x1): y=100*(x1-x0 **2) **2 + (1-x0) ** 2 return y 이 코드를 실행하면 x0와 x1의 미분을 각각 -2.0과 400.0이라고 나온다. 이때 두 미분값을 모은 값, 즉 (-2.0, 400.0) 벡터를 기울기..

30. 테일러 급수 미분

sin 함수 구현 Sin 클래스와 sin 함수는 다음처럼 구현할 수 있다. class Sin(Function): def forward(self,x): y=np.sin(x) return y def backward(self,gy): x=self.inputs[0].data gx=gy * np.cos(x) return gx def sin(x): return Sin()(x) 테일러 급수 이론 Sin 함수의 미분은 다음과 같은 테일러 급수를 이용한 방법으로 계산할 수 있다. 테일러 급수란 어떤 함수를 다항식으로 근사하는 방법으로, 수식으로는 다음과 같다. 여기서 f(x)=sin(x)를 위 식에 적용시켜 보면 다음과 같은 식이 나온다. 위 식에서 보듯 sin 함수는 x의 거듭제곱으로 이루어진 항들이 무한히 계속되는 ..

29. 연산자 오버로드

Mul 클래스 구현 Mul 클래스의 코드는 다음과 같다. class Mul(Function): def forward(self,x0,x1): y=x0 * x1 return y def backward(self,gy): x0,x1=self.inputs[0].data,self.inputs[1].data return gy * x1, gy * x0 def mul(x0,x1): return Mul()(x0,x1) 하지만 이렇게 사용하면 상당히 불편할 것 같다. 연산자 * 를 사용할 수 있게끔 바꿔보겠다. 연산자 오버로드 def __mul__(self,other): return mul(self,other) Variable 클래스에 이 __mul__ 메서드를 추가한다. 이제부터 *를 사용하면 __mul__ 메서드가 다시..