conv layer의 output을 그려보자
파이토치를 메모리를 아끼기위해 모델에서 나오는 마지막 output만을 저장한다.
그렇다면, 각 conv layer를 통과한 output이 궁금하다면 어떻게 해야할까??
hook을 이용하면 forward와 backward에서 각 레이어의 output을 가져올 수 있다.
여기서는 forward hook을 이용하는 class를 만들어서 이용해보고자 한다.
사용할 모델은 pretrain vgg16모델이며 input으로는 인터넷에서 아무 고양이 사진을 사용해보자.
1 | # 이미지 불러와서 tensor로 변환 및 사이즈 조정 |
- 이제 register_forward_hook을 이용해 입력한 layer에 hook을 등록할 수 있게 만든다.
1 | class LayerActivations(): |
- 이제 모델에서 첫번째 conv layer를 통과한 후 나오는 output을
LayerActivations
객체에 저장하고 이미지를 그려보자
1 | # vgg.features의 첫번째(0) 에 hook을 등록하고 output을 conv_out에 받도록 한다. |
첫번째 conv layer를 통과한 output을 그려보면 다음과 같다.
첫 번째 conv layer는 윤곽선에 집중되는 모습을 확인할 수 있다.
이를 이용해 마지막 conv layer 통과한 결과도 확인해보자.
1 | # 마지막 conv layer는 28번째 feature이다. |
위는 마지막 conv layer를 통과한 output을 시각화한 것이다.
마지막 레이어는 첫번째 레이어와 다르게 해석하기 어려운 특성을 학습하는 것으로 파악할 수 있었다.
이처럼 필요에 따라서 각 레이어의 output을 hook을 이용해 시각화하는 방법을 공부해 볼 수 있었으며 이를 통해 모델의 각 layer가 집중하는 부분도 확인할 수 있을것이라 생각한다.