Relu_code
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
import numpy as np class relu: def __init__(self): self.grad = None def Relu(self,x): self.grad = (x <= 0) out = x.copy() out[self.grad] = 0.0 return out def Relu_grad(self,dout): dout[self.grad] = 0.0 dx = dout return dx dout = np.array([-2.0,4,-1.1,5]) func = relu() x = np.array([-1.0,2.1,-0.3,4.2]) print(func.Relu(x)) print(func.Relu_grad(dout)) |
Relu function으로 입력 값 x <= 0 이면 0을 , x > 0 이면 x 자체를 출력하는 function이다. 
순전파 시에는 x <= 0 에 해당하는 값을 0으로 만들어 주어야한다. 그래서 grad = (x<= 0 ) 을 써서 grad 라는 변수에 x <= 0 인 값들을 True로 저장한다.

out = x.copy() -> x배열을 복사해 out이라는 변수에 대입하고 out[grad] = 0 ->
out[grad]는 x배열이 복사된 out에 grad 의 True에 해당하는 인덱스에만 0을 대입한다. 그리고 out을 출력하면
결과가 출력된다.
역전파 시에는 편미분의 결과가 0을 미분하면 0 이며, x를 미분하면 계수 1 이기 때문에 0인 인덱스는 0을 출력하고 0이 아닌 인덱스는 * 1 을 해주면 된다. 우리는 relu 라는 class에 x <= 0 인 인덱스 True로 저장해놓은 grad 변수가 있기 때문에 불러와 상류에서 전해져 오는 dout 값을 dout[grad] = 0 으로 변화시키고, 하류로 흘려보내는 dx 값에 dout 을 그대로 대입해주면 된다.
