Hello Computer Vision

Depthwise seperable convolution 이해해보기(XceptionNet, MobileNet) 본문

딥러닝/파이토치

Depthwise seperable convolution 이해해보기(XceptionNet, MobileNet)

지웅쓰 2023. 1. 25. 17:08

모델공부를 하는 도중 생소하지는 않았지만 완전히 이해하기는 힘들어서 정리해보려고 합니다.

뒤쪽에 많은 분들이 헷갈릴만한 부분들에 대해서 최대한 정리해보았습니다.

출처 : 영상자료,블로그자료

 

우리가 사용하는 일반 convolution을 본다면 다음 이미지와 같다.

이미지의 $D_{F}$는 input값의 h,w를 뜻하고 $D_{k}$는 kernel의 크기를 뜻한다.

만약 (3,64,64)크기의 input이 있고 이를 16깊이의 채널 깊이를 만들고 싶다면 (3, $D_{k}, D_{k}$) 의 커널 16개의 계산을 수행하면 되는 것이다.(그림 참조)

그렇다면 연산량은 어떻게 될까?

연산에 사용되는 커널크기, input값의 채널크기, output값의 이미지크기, 원하는 깊이의 채널크기가 될 것이며 여기서 사용된 기호를 써보자면

$D^{2}_{k} * D^{2}_{G} * N^{2} * M^{2}$ 가 되는 것이다.

 

Depthwise seperable convolution은 2가지 과정으로 나뉘어진다. Depthwise convolution, Pointwise convolution.

먼저 Depthwise convolution을 살펴보자.

이를 잘 나타내주는 이미지이다.

위에서의 기존 convolution에서는 input값의 채널과 output값의 채널이 달랐다면 여기서는 이 크기를 맞춰준다.

예를들어 (3, 64, 64)의 input이 들어온다면 output도 3의 채널깊이를 갖게 하도록 맞추는 것이다.

이미지에 나온 것처럼 input값에 대한 채널과 output값의 채널이 같으므로 한 필터당 1개의 채널만을 계산해 이를 합치는 것으로 알 수 있다.

그런데 나는 여기서 의문점이 생겼다. XceptionNet을 구현하는 과정에서 다른 분의 코드를 보니 그저 nn.Conv연산을 사용한 것이다. 다른 블로그들의 설명을 보아도 채널깊이만 맞췄을뿐 다른 클래스를 사용하지 않았다.(nn.Conv2d만 사용)

그렇다면 output과 input값의 채널깊이만 같아도 안에서 알아서 해주나?  라는 생각이 들었고 nn.Conv2d docu를 찾아보았다. 링크 : nn.Conv2d 

역시 따로 정의되어 있었다.. input의 채널 = k x output채널이라면 depthwise convolution연산을 할 수있도록 설정되어 있었다.(nn.Cov2d의 group인자의 default값은 1이다)

 

Depthwise convolution뒤에 이어지는 연산은 Pointwise convolution이다.

이 글에서의 예시는 3에서 16의 채널을 만드는 것이었다. 그러나 Depthwise에서는 3에서 3으로 밖에 만들지 않았다.

그러므로 1x1 convolution을 사용하여 채널 깊이도 16으로 만드는 것이다. 1x1 convolution은 알다시피 채널깊이를 바꿀 때 용이하며 연산량을 줄여준다.

 

 

이렇게 Depthwise seperable convolution의연산량을 보자면 다음과 같다.

 


 

이렇게 비교해보았습니다. 개념적으로는 알고 있었는데 어떻게 구현되는지(코드상) 몰라서 답답했었는데 역시 docu를 찾아보면 다 나오는군요..

 

'딥러닝 > 파이토치' 카테고리의 다른 글

GELU에 대해 이해해보기  (0) 2023.02.16
super().__init__() 쓰는 이유 및 부모 클래스 상속  (0) 2023.02.10
transforms.Resize  (0) 2023.01.21
nn.AdaptiveAvgPool2d 란?  (0) 2023.01.19
nn.ReLU 에서의 inplace = True 의미  (0) 2023.01.19