MobileNet

오늘은 MobileNet에 대해서 알아보겠습니다.

 

일단 MobileNet은 모델의 경량화에 관련된 모델입니다.

 

모델의 경량화를 하는 이유로는 핸드폰이나 임베디드 시스템 같이 저용량 메모리 환경에 딥러닝을 적용하기 위함입니다.

 

MobileNet에서는 메모리가 제한된 환경을 최적으로 맞추기 위해 두개의 Parameter를 사용합니다.

 

일단 MobileNet의 구조를 이해하기 위해 MobileNet에서 사용한 Depthwise Separable Convolution을 먼저 살펴보겠습니다.

 

위의 사진은 CNN에서 filter가 이미지에 어떻게 적용이 되는지 보여줍니다.

 

즉, filter 하나당 output channel (feature map) 하나가 생성됩니다.

 

 


Depthwise Separable Convolution

Convolution

(a)

Depthwise Separable Convolution을 들어가기 전에 간단하게 Convolution의 형태에 대해 정의하고 진행하겠습니다.

 

위 사진은 Convolution의 연산 진행 방식입니다.

  1. Dk: 가로, 세로
  2. M: channel
  3. N: Dk, M인 Filter의 개수

그렇다면 Convolution의 연산량은

(b)
(c)

위의 사진과 같게 됩니다.

 

여기서 Dg는 (a)사진의 맨 오른쪽인 Output의 가로,세로 크기입니다.

 

D^2g를 한 이유는 Dk의 필터가 가로로 Dg만큼, 세로로 Dg만큼 이동하기 때문입니다. (c) 참조

 

결과적으로 CNN의 연산량은  N x D^2g x D^2k x M이 됩니다.

 

Depthwise Separable Convolution을 통해 어떻게 연산량을 줄이는지 살펴보겠습니다.

 


Depthwise Separable Convolution은 두단계로 나눌 수 있습니다.

 

첫번째, Depthwise Convolution

두번째, Pointwise Convolution

 

먼저 Depthwise Convolution에 대해 알아보겠습니다.

 

 

1. Depthwise Convolution

 

일반적으로 CNN은 M채널을 가진 하나의 필터가 모든 채널에서 연산이 이루어 졌습니다.

 

여기서 핵심은 필터의 채널값입니다. Depthwise Convolution은 필터의 채널값을 1로 바꾼것입니다.

 

 

Dk x 1의 필터를 Input Data의 채널과 같게 만들어서 각 채널마다 Dk x 1 필터를 적용한 것입니다.

 

쉽게 얘기하면 Input Data의 각 채널마다의 전용 필터가 생긴것입니다.

 

그렇다면 연산량을 계산해 보면 D^2g x D^2k x M 이 됩니다.

 

여기서 비교를 해보겠습니다.

  • 기존 Convolution: D^2g x D^2k x M x N
  • Depthwise Convolution: D^2g x D^2k x M 

한눈에 봐도 N이 사라지는걸 확인할 수 있습니다.

 

다음은 Pointwise Convolution입니다.

 

 

 

2. Pointwise Convolution

 

Pointwise Convolution은 커널의 모양이 1 x 1 x M 입니다.

 

연산량 계산을 해보겠습니다.

 

D^2g x M x N

 

기존의 Convolution의 연산량과 비교해보겠습니다.

  • 기존 Convolution: D^2g x M x N x D^2k
  • Pointwise Convolution: D^2g x M x N

여기서는 무려 D^2k가 사라졌습니다.

 

이제 Depthwise Separable Convolution의 연산량을 구해보겠습니다.

 

그냥 위의 Depthwise Convolution과 Pointwise Convolution의 연산량을 더해주면 된다!

 

Depthwise Separable Convolution: D^2g x D^2k x M + D^2g x M x N

 

※ D^2g x M x ( D^2k +N)

 

연산량을 비교해보면

연산량이 1/9까지 줄어든것을 알 수 있습니다. N과 Dk는 임의의 수를 대입해준것입니다.

 

Depthwise Convolution과 Pointwise Convolution은 여러곳에서 사용되니 알아두는 것이 좋습니다.

ex) xception, inception 등...

 


MobileNet Structure


Parameters

이제는 맨 위에서 언급했던 두개의 Parameters에 대해 알아보겠습니다.

1. Width Multiplier: α

논문에서 볼 수 있듯이 α라고 불리는 Width Multiplier가 있습니다.

Width Multiplier 의 경우 파라미터 α를 도입하여 uniform 하게 thin network를 만드는 것을 목적으로 합니다.

input channel M이 있을 떄, αM개의 output channel을 만들어 주는 것입니다.

α는 0~1사이의 값을 가지며 1, 0.75, 0.5 , 0.25등의 값을 넣어줄 수 있게 된다. baseline은 α=1인 경우입니다.

위의 결과를 보면 대략적으로 α*α의 scale로 연산량이 줄게 됩니다.

 

2. Resolution Multiplier: ρ

이번엔 resolution multiplier ρ를 도입해서 연산량을 줄입니다.

이것은 input이미지와 내부 모든 layer의 representation을 같은 곱으로 줄이는 것을 목적으로 합니다.

예를 들어 입력 해상도가 224 * 224면 192*192라던가 160*160 등으로 줄어들 수 있게 되는 것입니다.

 

 


Code

※ 여기서 주의할점:

 - Depthwise 구현시 groups를 in_channels와 맞춰준다!

ex) 

 - groups = 1이면, 모든 입력은 모든 출력과 convolution 연산이 됩니다. 일반적으로 알려진 convolution 연산

 - groups = 2이면, 입력을 2그룹으로 나누어서 각각 convolution 연산을 하고 그 결과를 concatenation

 - groups = in_channels이면, 각각의 인풋 채널이 각각의 아웃풋 채널에 대응되어 convolution 연산 후 concatenation

 

개인적으로 Depthwise Convolution과 Pointwise Convolution을 왜 같이 사용했는지에 대해 생각해보았습니다.

Depthwise는 서로 다른 채널끼리는 상관관계가 없고

Pointwise는 같은 채널에서 상관관계가 없기 때문에

이 두 방법을 사용하면 서로 단점이 보완돼서 사용하는 것 같습니다.

그렇다면 연산량을 줄이면서 Accuracy를 향상시킬 수 있는것 같습니다.

아직 많이 부족하니 수정해야할 부분이나 추가해야 할 부분 댓글 환영입니다!

 

다음은 어떤걸 알아볼지 고민중입니다... 볼게 너무 많네요.

 

 

 

출처:

'Deep Learning > Pytorch' 카테고리의 다른 글

23_Pytorch_EfficientNet  (0) 2021.11.24
26_Pytorch_Inception-v2, v3 (미완)  (0) 2021.10.25
22_Pytorch_RNN_Practice  (0) 2021.10.07
21_Pytorch_RNN  (0) 2021.10.06
20_Pytorch_ResNet  (0) 2021.10.06

+ Recent posts