# 세줄 요약 #
- Depthwise separable convolution 은 각 채널별로 나누어 각각의 feature map에 대해 1-channel convolution을 연산하는 depthwise 단계와 채널별로 구해진 feature map을 1x1 kernal convolution으로 하나의 channel로 합성시키는 separable 단계로 이루어져 있다.
- 일반적인 convolution의 연산량은 다음의 식으로 계산한다: (kernel size)^2 * (input channel number) * (input_size)^2 * (output channel number) * (output size)^2
- Depthwise separable convolution의 경우 depthwise 단계에서 input channel number = 1로 소거되고, separable 단계에서 kernel size = 1로 소거되면서 전체적인 연산량이 감소한다.
# 상세 리뷰 #
1. Depthwise Separable convolution 소개 [MobileNet V1]
- Depthwise Separable convolution Algorithm
- Stage 1. Depthwise Convolution: 채널 전체를 Conv 연산하지 않고, 각각의 feature map에 대해 1-channel Conv 연산을 수행한 후 Concatenate 형태로 각각의 결과 feature map들을 채널별로 쌓아준다.
- Stage 2. Separable Convolution: 채널별로 구해진 feature map을 1x1 kernal Conv 연산으로 하나의 channel로 합성시킨다.
- 두 연산 모두 연산량을 감소시키는 효과를 준다.
- 두 단계로 나누어져 있음에도 두 연산량을 더한 것이 전체 채널에 대해 한번에 수행하는 기존의 Conv 연산보다 연산량이 적다.
- MobileNet V1 논문(arXiv:1704.04861 [cs.CV])에서 처음 소개
- MobileNet은 그 목적이 모바일 기기에서 학습이 가능한 신경망 모델을 만드는 것
- 따라서, 연산량 감소를 최우선 목표로 하고 개발된 신경망 모델이다.
- 위의 예시는 224 x 224 x 3 shape를 가진 imagenet 데이터셋을 사용했을 때의 예제이다.
- 따라서 Depthwise 단계에서 channel 수가 꼭 3일 필요는 없으며, 다양한 채널수로 늘린 다음에 각각에 대해 1-channel Conv 연산을 수행하면 된다.
- 마찬가지로 Separable 단계 또한 결과 영상의 Channel이 꼭 1일 필요는 없으며, 다양한 채널수로 바꾸어도 된다.
- Depthwise 단계에서 각각 연산된 feature map들이 하나의 영상으로 Stack(쌓아지다)된 후 1x1 kernel convolution으로 채널 수만 바꿔주는 것이다.
2. 연산량 비교 계산
2-1. 기존 Conv 연산량 계산
- 연산량 계산식: Dk^2 * M * Df^2 * N * Dg^2
- Dk = kernel size
- Df = input size
- Dg = output size
- M = input channel
- N = output channel
- kernel 크기에 input 채널을 곱한 만큼(Dk * Dk * M)의 Convolution filter가 input 영상 크기(Df^2)에 연산을 수행하여 output 영상의 크기(Dg^2)와 output 영상의 채널(N)만큼의 결과가 나와야한다.
2-2. Depthwise Conv 연산량 계산
- 연산량 계산식: Dk^2 * 1 * Df^2 * M * Dg^2
- M = 1 : Depthwise Conv 연산은 각각의 채널별로 나누어 1 channel에 대해서만 독립적으로 Conv 연산을 수행하기에 input channel 값(M)이 1이 된다.
- N = M: Depthwise Conv의 결과 영상은 인풋 영상의 채널 수만큼 각각 연산을 수행한 결과를 concatenate로 쌓아서 합쳤기에 output channel의 크기(N)는 input channel의 크기(M)와 같다.
2-3. Separable Conv 연산량 계산
- 연산량 계산식: 1 * M * Df^2 * N * Dg^2
- Dk = 1 : Separable Conv 연산은 1x1 kernel convolution을 수행하기에 kernel size(Dk)는 1로 소거된다.
- Df = Dg : Separable Conv 연산은 1x1 kernel convolution을 수행하기에 input 영상(Df)과 output 영상(Dg)의 크기는 변화가 없다.
2-4. 기존 Conv 연산량 v.s. Depthwise Separable Conv 연산량
- 기존 Conv 연산량 계산식:
- = M* N * Dk^2 * Df^2 * Dg^2
- Depthwise Separable Conv 연산량 계산식:
- = (M * Dk^2 * Df^2 * Dg^2) + (M * N * Df^2 * Dg^2)
- = M * Df^2 * Dg^2 * (Dk^2 + N)
- 연산량 크기 비교
- 만약 결과 영상의 Channel 수(N)가 256, Kernel size(Dk)가 3이라면, 기존 Convolution 대비 Deptwise Separable Convolution은 연산량이 약 11.5%로 감소되었음을 확인할 수 있다!
* Reference:
- Depthwise Separable Convolution - A FASTER CONVOLUTION! [CodeEmporium]: https://youtu.be/T7o3xvJLuHk
- 맛비의 AI FPGA Story: https://m.blog.naver.com/chacagea/221582912200
- Howard, Andrew G., et al. "Mobilenets: Efficient convolutional neural networks for mobile vision applications." arXiv preprint arXiv:1704.04861 (2017).
728x90
728x90
'AI프로그래밍 리뷰 > 인공지능' 카테고리의 다른 글
머신러닝의 데이터셋 종류와 모델 평가 (0) | 2020.07.24 |
---|---|
인공지능과 머신러닝, 딥러닝의 관계 (0) | 2020.07.24 |
댓글