2023.12.18 DAY64
torch가 아닌 단순 numpy를 사용하여 간단한 CNN을 구현해보았다. forward, backward 다 구현해보았다. forward의 경우 수월하게 따라갔는데 backward는 처음에 많이 헷갈렸다ㅠ 수식으로는 다 이해가 되었지만 실제로 하나하나 구현해보니 왜 단순 곱셈을 하다가 conv을 수행하지? 왜 shape을 저렇게 변환하지? 라는 의문이 생겼다. 지금은 의문이 해결되었고 이렇게 다 구현해보는게 많은 도움이 되는 것 같다는 생각을 했다.
오늘 거의 코딩을 한 것 같아서 TIL을 어떻게 적어야할지 모르겠다. 구현한 코드를 올려야겠다.
📝 배운 내용
shallow network
구조
W2 미분
- 미분을 진행하면 2x2 행렬이 나오게 되는데 W2는 1x4 형식이기 때문에 reshape을 해준다
W1 미분
- max pooling의 경우, 어느 위치의 값이 선택되었는지 확인하고 그 위치의 값을 1로 해주기 위해서 L1_max를 2배하여 L1_act(max pooling 진행하기 전의 값)과 비교한다
- 그리고 그 값들에 미분값을 다 적용시켜야하기 때문에 diff_w1_b의 값도 2배를 해준다
- 그 후에 마지막에는 conv를 수행한다.
그 이유는 아직 잘 모르겠다ㅠㅠ weigt 마다 갱신을 해주기 위해서 conv을 수행한다. 처음 filter를 씌울 때의 영역으로 conv를 수행한다.