분류 전체보기 428

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.DFS-조합

https://leetcode.com/problems/combinations/ Combinations - LeetCode Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview. leetcode.com 이번 포스팅에선 저번 순열에 이은 DFS로 조합에 대해 풀이해보겠다. 조합은 순열과 달리 원소의 순서가 달라도 구성되어져있는 원소의 종류가 같으면 같다고 처리해야한다. 예를들어 [1,3] 과 [3,1]은 조합에서 같은 것이다. 순열에서 풀이했던 코드와 상당히 유사하다. def combine(n: int, k: i..

18.DFS - 순열

https://leetcode.com/problems/permutations/ Permutations - LeetCode Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview. leetcode.com 이번 포스팅에서는 DFS를 이용한 순열에 대해서 정리해 보겠다 순열은 다음 그래프처럼 DFS로 해결할 수 있다. 풀이 방법에는 두가지 방법이 있다. 먼저 재귀구조로 문제를 풀어보겠다. def permute(nums): sol=[] def dfs(index,array): if len(array) == len(num..

tesseract와 EAST detector를 이용한 글씨 인식

이번 포스팅에서는 EAST detector를 이용해서 image 안에 있는 글씨를 인식하고 tesseract로 어떤 글씨인지 읽어오는 프로젝트에 대해 소개하겠다. OpenCV의 EAST text detector는 새로운 아키텍처와 학습 패턴을 기반으로 한 딥러닝 모델이다. 이것은 720p image에서 13FPS의 거의 real-time에 가까운 성능을 보여주고, 최첨단의 text 검출 정확도를 얻게해준다. 프로젝트를 하면서 글씨를 인식하는데 주위 빛, 조명 글씨의 정성도 등이 검출하는데 매우 중요한 역할을 한다는 것을 알게 되었다. 먼저 필요한 module들을 import 해주고 상수, path를 지정해준다. from imutils.object_detection import non_max_suppres..

Object Detection 2021.09.05