본문 바로가기
반응형

분류 전체보기154

19단계) 변수 사용성 개선 이번 단계에서는 Variable 클래스를 더 쉽게 사용할 수 있도록 개선할 것이다. 1. 변수 이름 지정 앞으로 수많은 변수를 처리해야 하므로, 변수에 '이름'을 붙여줄 것이다. class Variable: def __init__(self, data, name=None): if data is not None: if not isinstance(data, np.ndarray): raise TypeError('{} is not supported'.format(type(data))) self.data = data self.name = name self.grad = None self.creator = None self.generation = 0 #생략 Variable클래스에 name 인스턴스 변수를 추가하였다. .. 2021. 6. 19.
17~18단계) 메모리 관리 방식 , 순환 참조 , 메모리 절약 모드 1. 메모리 관리 방식 CPython의 메모리 관리는 두 가지 방식으로 진행된다. 참조(reference) 수를 세는 방식과 세대(generation)를 기준으로 쓸모없어진 객체를 회수하는 방식이다. 앞으로 전자를 참조 카운트로, 후자를 GC(Garbage Collection)라고 부를 것이다. 먼저 참조 카운트 방식을 살펴본 후 GC를 볼 것이다. 1) 참조 카운트 방식 모든 객체는 참조 카운트가 0인 상태로 생성된다. 다른 객체가 참조할 때마다 1씩 증가하고 객체에 대한 참조가 끊길 때마다 1씩 감소하다가 0이 되면 해당 객체는 메모리에서 삭제된다. 예를 들어, 대입 연산자를 사용하거나 함수에 인수로 전달하거나 컨테이너 타입 객체에 추가할 때 참조 카운트가 증가한다. class obj: pass de.. 2021. 6. 19.
15~16단계) 복잡한 계산 그래프의 이론 및 구현 1. 복잡한 계산 그래프(이론 편) 1) 복잡한 계산 그래프 지금까지는 아래와 같은 일직선 계산 그래프에 대해 구현했다. 이제는 아래와 같이 변수와 함수가 복잡하게 연결된 그래프를 다루어볼 것이다. 현재의 DeZero는 이런 복잡한 연결의 역전파를 제대로 할 수 없다. 2) 역전파의 올바른 순서 아래 계산 그래프의 역전파 순서에 대해 생각해보자. 올바른 역전파를 계산한다면 그 순서는 아래와 같을 것이다. 2) 현재의 DeZero 역전파 순서 그러나 아래와 같이 구현되어 있는 현재 DeZero의 역전파 흐름은 올바른 순서와 다르다. class Variable: #생략 def backward(self): if self.grad is None: self.grad = np.ones_like(self.data) .. 2021. 6. 15.
11~14단계) 가변 길이 인수 대응 ( 순전파 , 역전파 ) 지금까지 입출력 변수가 하나씩인 경우만 고려해왔는데, 이번 포스팅에서는 가변 길이 입출력에 대응할 수 있도록 DeZero를 확장할 것이다. 1. 가변 길이 인수(순전파 편) 1) 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_creators(self) self.inputs = inputs self.outputs = outputs return outputs def forward(self, xs): raise NotI.. 2021. 6. 15.
728x90
반응형