Deep learning/모델 구현 39

28. 변수 사용성 개선

변수 이름 지정 class Variable: def __init__(self,data,name=None): if data is not None: if not isinstance(data,np.ndarray): raise TypeError('{}는 지원하지 않습니다'.format(type(data))) self.data=data self.name=name self.grad=None self.creator=None self.generation=0 # 세대 수를 기록하는 변수 ndarray 인스턴스 변수 variable은 데이터를 담는 상자 역할을 한다. 그러나 사용하는 사람 입장에서 중요한 것은 상자가 아니라 그 안의 데이터 이다. 그래서 Variable이 데이터인 것처럼 보이게 하는 장치, 즉 상자를 투명..

27. 메모리 관리

weakref 모듈 파이썬에서는 weakref.ref 함수를 사용하여 약한 참조를 만들 수 있다. 약한 참조란 다른 객체를 참조하되 참조 카운트는 증가시키지 않는 기능이다. 이 weakref 구조를 DeZero에도 도입한다. 먼저 Function이다. import weakref class Function: def __call__(self, *inputs): xs=[x.data for x in inputs] ys=self.forward(*xs) if not isinstance(ys,tuple): ys=(ys,) outputs=[Variable(as_array(y)) for y in ys] self.generation=max([x.generation for x in inputs]) for output in ..

26. 복잡한 계산 그래프

지금의 DeZero는 다음 그림과 같은 계산 그래프도 만들 수 있다. 그러나 지금의 DeZero는 이런 계산의 미분은 제대로 계산하지 못한다. 더 정확하게는 이런 복잡한 연결의 역전파를 제대로 할 수 없다. 세대 추가 class Variable: def __init__(self,data): if data is not None: if not isinstance(data,np.ndarray): raise TypeError('{}는 지원하지 않습니다'.format(type(data))) self.data=data self.grad=None self.creator=None self.generation=0 # 세대 수를 기록하는 변수 def set_creator(self,func): self.creator=fun..

25. 가변 길이 인수(역전파)

가변 길이 인수에 대응한 Add 클래스의 역전파 덧셈의 역전파는 출력 쪽에서 전해지는 미분값에 1을 곱한 값이 입력 변수(x0,x1)의 미분이다. 즉, 상류에서 흘러오는 미분값을 그대로 흘려보내는 것이 덧셈의 역전파이다. class Add(Function): def forward(self,x0,x1): y=x0+x1 return y def backward(self,gy): return gy,gy Variable 클래스 수정 class Variable: def __init__(self,data): if data is not None: if not isinstance(data,np.ndarray): raise TypeError('{}는 지원하지 않습니다'.format(type(data))) self.data..

24. 가변 길이 인수(순전파)

지금까지는 합수에 입출력 변수가 하나씩인 경우만 생각했다. 그러나 함수에 따라 여러 개의 변수를 입력 받기도 한다. Function 클래스 수정 가변 길이 입출력을 표현하기 위해 변수들을 리스트(또는 튜플)에 넣어 처리한다. class Function: def __call__(self,inputs): xs=[x.data for x in inputs] ys=self.forward(xs) outputs=[Variable(as_array(y)) for y in ys] for output in outputs: output.set_creator(self) # 출력 변수에 참조자 설정 self.inputs=inputs self.outputs=outputs # 출력도 저장 return outputs def forwa..

23. 역전파 자동화

이번에는 역전파를 자동화해보겠다. 더 정확히 말하면, 일바적인 계산(순전파)를 한 번만 해주면 어떤 계산이라도 상관없이 역전파가 자동으로 이루어지는 구조를 만들 것이다. 이것이 바로 Define-by-Run의 핵심이다. 먼저 일반적인 계산(순전파)이 이루어지는 시점에 '관계'를 맺어주도록 (즉, 함수와 변수를 연결 짓도록) 만들겠다. class Variable: def __init__(self,data): self.data=data self.grad=None self.creator=None def set_creator(self,func): self.creator=func class Function: def __call__(self,input): x=input.data y=self.forward(x) ou..

22. 역전파

머신러닝은 주로 대량의 매개변수를 입력받아서 마지막에 손실 함수를 거쳐 출력을 내는 형태로 진행된다. 즉, 손실 함수의 각 매개변수에 대한 미분을 계산해야한다. 이런 경우 미분값을 출력에서 입력 방향으로 전파하면 한 번의 전파만으로 모든 매개변수에 대한 미분을 계산할 수 있다. 이처럼 계산이 효율적으로 이뤄지기 때문에 미분을 반대 방향으로 전파하는 방식(역전파)를 이용하는 것이다. 역전파를 구현할때 주의할 점은 순전파 시 이용한 데이터가 필요하다는 것이다. 따라서 역전파를 구현하려면 먼저 순전파를 하고, 이때 각 함수가 입력 변수의 값을 기억해두지 않으면 안된다. 그런 다음에야 각 함수의 역전파를 계산할 수 있다. 역전파에 대응하는 Variable 클래스를 구현 class Variable: def __i..

21. 수치미분

지금까지 Variable 클래스와 Function 클래스를 구현했다. 이 클래스들을 구현한 이유는 미분을 자동으로 계산하기 위해서이다. 수치 미분을 구현하기 전에 수치 미분에 대해 알아보겠다. 수치 미분은 작은 값을 사용하여 진정한 미분을 근사한다. 따라서 값에 어쩔 수 없이 오차가 포함되는데, 이 근사 오차를 줄이는 방법으로는 중앙차분이라는게 있다. def numerical_diff(f,x,eps=1e-4): x0=Variable(x.data - eps) x1=Variable(x.data + eps) y0=f(x0) y1=f(x1) return (y1.data - y0.data) / (2 * eps) 다음 코드 처럼 합성 함수의 미분을 구현할 수 있다. def f(x): A=Square() B=Exp(..

20. 변수와 함수

이번 포스팅 부터는 밑바닥 부터 시작하는 딥러닝 3에 관한 내용들을 정리해서 올리겠다. 이 책을 통해 tensorflow나 pytorch가 어떻게 짜여져있는지 framework를 직접 구현해보면서 공부할수 있을 것 같다. 먼저 사용할 변수에 대해 정의한다. class Variable: def __init__(self,data): self.data=data 앞으로 이 변수의 내용이 점점 많아질 것이다. 함수의 큰 뼈대를 정의해준다. class Function: def __call__(self,input): x=input.data y=self.forward(x) # 구체적인 계산은 forward 메서드에서 한다 output=Variable(y) return output def forward(self,x): ..

19. CNN(6) - CNN 시각화하기, 대표적인 CNN

이 포스팅은 밑바닥부터 시작하는 딥러닝을 공부하고 정리한것 입니다. CNN을 구성하는 합성곱 계층은 입력으로 받은 이미지를 데이터에서 '무엇으로 보고 있는' 걸까? 이번 절에서는 합성곱 계층을 시각화해서 CNN이 보고있는 것이 무엇인지 알아보도록 하겠다. 1. 1번째 층의 가중치 시각화 하기 앞에서 MNIST 데이터셋으로 간단한 CNN 학습을 해보았는데, 그때 번째 층의 합성곱 계층의 가중치는 그 형상이 (30,1,5,5) 였다. (필터 30개, 채널 1개, 5x5크기). 필터의 크기가 5x5이고 채널이 1개라는 것은 이 필터를 1채널의 회색조 이미지로 시각화할 수 있다는 뜻이다. 그럼 합성곱 계층(1층째) 필터를 이미지로 나타내보자. 학습전 필터는 무작위로 초기화되고 있어 흑백의 정도에 규칙성이 없다...