Image Classification

컴퓨팅 부하 경감을 위한 SeparableConv2D

coding art 2022. 1. 20. 21:50
728x90

이 블로그 내용은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 ...