반응형 딥러닝30 20~22단계) 연산자 오버로드 Variable 인스턴스 a와 b가 있을 때, y = a * b처럼 연산자에 대응하는 작업이 필요하다. 먼저 곱셈을 수행하는 클래스 Mul을 구현할 것이다. 연산자 오버로드(1) 1. 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 Mul 클래스를 파이썬 함수로 사용할 수 있도록 한다. def mul(x0, x1): return Mul()(x0, x1) 이제 mul함수를 사용하여 곱셈을 할 수 있다. a = Variable(np.array.. 2021. 6. 19. 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. 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. 이전 1 2 3 4 5 6 7 8 다음 728x90 반응형