티스토리 뷰
[논문리뷰] MobileNet V1 설명, pytorch 코드(depthwise separable convolution)
minimin2 2020. 2. 27. 00:14안녕하세요, 오늘은 MobileNet:Efficient Convolutional Neural Networks for Mobile Vision Application에 대해 리뷰해보겠습니다.
논문 링크: https://arxiv.org/abs/1704.04861
CNN의 초기 모델 VGG Network는 다들 아실 겁니다.
아래는 VGG-16 Network의 구조입니다.
단순히 채널 수를 증가시키며 convolution-pooling 의 연속으로 구성되어있습니다.
가장 직관적인 구조로 이해도 쉽고 구현하기도 쉽습니다.
하지만 모바일 환경에서 구동시키기엔 convolution 구조가 다소 무겁습니다.
그래서 파라미터량을 획기적으로 줄이기 위해 MobileNet이라는 새로운 논문이 나오게 됩니다.
이는 기존의 convolution 연산을 depthwise separable convolution으로 변경한 것입니다.
depthwise separable convolution이란 depthwise convolution과 pointwise convolution의 결합으로 보시면 됩니다.
그림으로 보시면 더욱 이해하기 쉽습니다.
depthwise convolution은 채널별로 분리하여 각 채널을 각각의 커널로 convolution 하는 것입니다.
이때, 입력의 채널과 출력의 채널은 항상 같습니다.
pointwise convolution은 출력의 채널을 바꿀 수 있으며, 1x1 conv하는 것을 말합니다.
이렇게 하면 어떤 장점이 있는지 파라미터량 관점에서 확인해 보겠습니다.
예를들어 3x3x3의 입력이 들어왔을 때 convolution 연산을 통해 3x3x3의 출력을 내고 싶은 경우를 가정하겠습니다.
1) 기존의 convolution의 경우,
3x3x3의 커널이 3개이므로 파라미터량은 3x3x3x3=81
2) depthwise separable convolution의 경우,
3x3x1의 커널이 3개(depthwise), 1x1x3의 커널이 3개이므로 파라미터량은 3x3x1x3+1x1x3x3=27+9=36
위와 같이 파라미터수를 획기적으로 줄일 수 있습니다.
MobileNet의 전체 구조는 아래와 같습니다.
사실상 위의 VGG와 구조는 거의 비슷하지만 기존의 convolution을 depthwise separable convolution으로 대체하고 pooling대신 stride를 2로 하여 size를 축소한 것이 큰 차이라고 할 수 있습니다.
[Result]
획기적으로 파라미터량이 줄었음에도 불구하고, VGG16과 비교하였을 때 성능은 크게 떨어지지 않는 실험 결과를 보입니다.
(더 많은 실험결과는 논문에 있습니다.)
[Source Code]
그럼 이와같은 depthwise separable convolution을 pytorch에서 어떻게 구현하는지 알아보겠습니다.
def conv_dw(ch_in, ch_out):
return nn.Sequential(
# dw
nn.Conv2d(ch_in, ch_in, kernel_size=3, stride=1, padding=1, groups=ch_in),
nn.BatchNorm2d(ch_in),
nn.ReLU(),
# pw
nn.Conv2d(ch_in, ch_out, kernel_size=1, stride=1, padding=0),
nn.BatchNorm2d(ch_out),
nn.ReLU(),
)
depthwise convolution에서는 input의 채널, output의 채널, groups를 모두 같게 하면 됩니다.
pointwise convolution은 kernel_size는 1로 하시면 됩니다.
전체 소스는 아래 github에 있습니다.
github 소스코드: https://github.com/jmjeon94/MobileNet-Pytorch/blob/master/MobileNetV1.py
[이미지 출처]
'ML | DL' 카테고리의 다른 글
[딥러닝] 이미지 평가방법(Confusion matrix, Recall, Precision, Accuracy, F1 Score) (0) | 2020.05.18 |
---|---|
[논문리뷰] MobileNet V2 설명, pytorch 코드(Inverted Residuals and Linear Bottlenecks) (3) | 2020.03.02 |
[논문리뷰] CAM(Class Activation Map-Learning Deep Features for Discriminative Localization) (3) | 2019.12.05 |
[딥러닝]tensorflow로 CNN구현하기(MNIST) (0) | 2019.02.14 |
[딥러닝]tensorflow로 손글씨 숫자 인식하기(MNIST) (0) | 2019.01.31 |
- Total
- Today
- Yesterday