이 블로그 내용은Keras 기초 예제: U-Net 아키텍처 동물이미지 ... 블로그(http://blog.daum.net/ejleep1/1198)에서 사용되는 SeparablConv2D 명령의 보충설명을 위해서 다음 url 주소의 블로그를 참조하여 작성하였음. https://towardsdatascience.com/a-basic-introduction-to-separable-convolutions-b99ec3102728
_________________________________________________________________
semantic segmentation 의 model 에서 컨볼류션하기 위한 알고리듬을 짤 경우 일반 Conv2D 를 사용하지 않고 특별히 분리가능한 컨볼루션(SeparableConv2D) 명령을 사용하는지 그 이유에 대해서 알아보자. 근본적인 이유는 엄청난 컴퓨팅 부담을 급격히 줄여 경감하기 위한 것이다.
Normal Convolution
12X12x3 이미지를 대상으로 5X5X3 kernel(필터)로 컨볼루션해 보도록 하자. 결과 8X8X1 이 얻어질 것이다. kernel 로 한번 작업한다는 의미는 5X5 즉 25개의 곱셈과 그들을 합을 계산하기 위한 연산이 일어나는 셈이다.
만약 256개의 5X5X3 필터로 컨볼루션한다면 결과 8X8X256 이 얻어질 것이다. 이과정을 요약해보면
12X12X3 —> (5X5X3X256) — >8X8X256 이 된다.
이러한 컨볼루션 작업에서 수반되는 곱셈의 수를 추산해보자. 즉 256개의 5X5X3 kernel 을 8X8 만큼 컨볼루션 시키면
256 X 5X5X3 X 8X8 = 245,760 만큼의 곱셈이 수반된다.
이와 같은 컨볼루션 연산을 2종류 즉 depthwise 와 pointwise 컨볼루션 연산을 사용하여 2단계로 재구성해 보자.
Depthwise Convolution
RGB 색상에 따른 channel 수가 3이므로 channel별로 5X5X1 kernel 을 준비하면 입력 이미지와 channel 두께가 3이므로 서로 일치한다. 따라서 평면상에서 8X8 컨보루션 시키면 결과 8X8X3이 얻어진다. 즉 5X5X3 kernel 을 8X8 만큼 컨볼루션 시키면 5X5X3 X 8X8 = 4,800 만큼의 곱셈이 수반된다.
Pointwise Convolution
앞 단계에서 얻어진 8X8X3 에 대해 1X1X3 kernel로 컨볼루션 작업을 실행하면 8X8X1 이 얻어진다. 1X1 kernel이 소위 말하는 poitwise convolution 을 위한 kernel을 뜻한다.
즉 256개의 1X1X3 kernel을 적용하게 되면 8X8X256 이 얻어지게 된다. 즉 256개의 1X1X3 kernel 을 8X8 만큼 컨볼루션 시키면 256 X 1X1X3 X 8X8 = 49,152 만큼의 곱셈이 수반된다.
Depthwise 와 Poitwise 곱셈수를 합해 보면 4,800+49,152 = 53,952 로서 맨앞의 단순 컨볼루션 작업의 245,760에 비해 22% 로 경감됨을 알 수 있다.
즉 Normal Convolution 에서는 256개의 5X5X3 을 사용하여 8X8X256 이라는 결과를 얻어내는 반면에 Depthwise 를 한번 실행하면 1개의 5X5X3 을 사용하여 8x8X3 을 얻은 후 다시 pointwise convolution에서 256개의 1X1X3 을 사용하여 최종적으로 normal convolution 의 결과와 동일한 8X8X256이라는 결과를 얻어낸다.
실제 semantic segmentation 코드에서 SeparableConv2D 적용 사례를 살펴보자.
다음 코드는 U-Net의 모델 단계에서 첫 부분의 처리과정으로서 여기서는 kernel 3X3을 가지는 Conv2D 가 그대로 적용된다.
첫 Conv2D 후 필터수를 늘리면서 SeparableConv2D 를 연속 2회 시행한다. 이때에 shape 변화는 없으며, MaxPooling 은 컨볼루션이 아니므로 1회 적용한다. 마지막으로 pointwise 컨볼루션은 1X1 이므로 그냥 Conv2D를 시행한다.
이와 같이 SeparabeleConv2D 를 적용해도 학습에 소요되는 시간이 구글 Colab 의 GPU를 사용해도 25분 이상이 소요됨에 유의하자.
물론 컴퓨팅 부하 경감을 위해서 SeparableConv2D 명령의 사용은 불가피해 보일지도 모르나 한편으로는 정밀도에 문제를 일으킬 수도 있어 일장 일단이 있음에 유의하자.
Under Construction ...
'Image Classification' 카테고리의 다른 글
윈도우즈10 아나콘다 YoLoV3 초간단 설치 (0) | 2022.01.24 |
---|---|
윈도우즈10 아나콘다에 YoLoV3 를 설치하자. (0) | 2022.01.21 |
PyTorch VGG16 모델 활용 Feature Map 관찰기법 (0) | 2022.01.15 |
리메이크:PyTorch ResNet Semantic Segmentation 예제 (0) | 2022.01.08 |
Google Colab에 의한 PyTorch AlexNet Image Classification (0) | 2022.01.08 |