M.L (p.166)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
import numpy as np class Relu: def __init__(self): self.mask = None def forward(self,x): self.mask = (x <= 0) out = x.copy() out[self.mask] = 0 return out def backward(self,dout): dout[self.mask] = 0 dx = dout return dx x = np.array([[1.0, -0.5], [-2.0, 3.0]]) print(x) mask = (x <= 0) print(mask) out = x.copy() out[mask] = 0 print(out) |
ReLu function 을 numpy array로 순전파와 역전파를 구현하는 코드이다.
ReLu의 식이며, x > 0 일때는 x 자체를 0보다 작을때는 0을 출력하는 function 이다. 역전파에 쓰이기 위해 이를 미분하면 0보다 클때는 그 자체 1 을 가지고 아닐때는 0을 전파한다.
ReLu picture
forward 구현은 입력받은 x 를 x <= 0 값일 때 True로 만들고 out 변수에 x.copy()로 복사하고 out[x<=0] = 0 으로 처리하면 x array 중 x <= 0 인 값들은 0이 되고 나머지는 그대로 출력된다.

backward 구현은 순전파 때의 값이 0 이하면 역전파 때도 0으로 온다. 그러므로 forward 에 만들어 놓았던 mask를 그대로 사용하여(x <= 0 을 True로 저장해놓은 값) dout[mask] = 0 을 넣어 그대로 출력하면 된다.