글의 가독성을 위해 아래 링크에 정리해둠.
https://blog.naver.com/younjung1996/223413266165
안녕하세요.
Google Coral에서 학습된 모델을 통해 추론을 할 수 있는 Coral Board & USB Accelator 가 있습니다.
저는 Coral Board를 사용하지 않고, 라즈베리파이4에 USB Accelator를 연결하여 사용할 생각입니다.
딥러닝을 위해 나온 제품이라 할지라도 아직 부족한 부분이 많습니다.
이런 고성능 환경이 아닌 곳에서도 학습하고, 추론할 수 있는 모바일 넷(Mobile Net)이 개발되었습니다.
그 중 Mobile Net의 Architecture에서 Depthwise Separable Convolution에 대해 이야기하겠습니다.
Depthwise separable Convoltion은 Parameter를 줄임으로, 연산량을 줄이고, 속도를 높이는 기법입니다.
https://hichoe95.tistory.com/48
Depthwise Separable Convolution = Depthwise Convolution + Pointwise Convolution
아마 Depthwise Separable Convolution을 공부하실 때 위 그림을 가장 많이 보셨을겁니다.
Depthwise Convolution으로 채널간 Spartial Correlations을 고려하여 ~ 각각 독립적으로 패턴을 파악하고 ~
Pointwise Convolution으로 Cross Channel Correlations로 채널을 조절할 수 있는 ~ 블라블라
위 블로그 분께서 굉장히 정리를 잘해주셨습니다.
그럼 저의 글의 목적은 무엇이냐.
Standard Convolution과 Depthwise Separable Covolution를 pytorch로 구현하여 정말로 파라미터 수와 연산량이 줄어드는지 결과값을 눈으로 확인하는 것입니다.
1. Standard Convolution
Convolution = K * K * C * M
k : Kernel ( 3으로 가정)
c : intput_dimension (channel ) (100으로 가정)
m : output_dimension (activation map) (1000으로 가정)
standard_convolution = nn.Conv2d(in_channels=100, out_channels=1000, kernel_size=3, bias=False)
----------------------------------------------------------------
Layer (type) Output Shape Param #
================================================================
Conv2d-1 [-1, 1000, 15, 15] 900,000
================================================================
Total params: 900,000
Trainable params: 900,000
Non-trainable params: 0
----------------------------------------------------------------
Input size (MB): 0.11
Forward/backward pass size (MB): 1.72
Params size (MB): 3.43
Estimated Total Size (MB): 5.26
----------------------------------------------------------------
2. Depth-wise Convolution
Depthwise Convolutuon = K * K * C
k : Kernel ( 3으로 가정)
c : intput_dimension (channel ) (100으로 가정)
m : output_dimension (activation map) (1000으로 가정)
depthwise_convolution = nn.Conv2d(in_channels=100, out_channels=1000, kernel_size=3, groups=100,bias=False)
----------------------------------------------------------------
Layer (type) Output Shape Param #
================================================================
Conv2d-1 [-1, 100, 15, 15] 900
================================================================
Total params: 900
Trainable params: 900
Non-trainable params: 0
----------------------------------------------------------------
Input size (MB): 0.11
Forward/backward pass size (MB): 0.17
Params size (MB): 0.00
Estimated Total Size (MB): 0.29
----------------------------------------------------------------
3. Point-wise Convolution ( 1 x 1 Convolution )
Pointwise Convolutuon = C * M
k : Kernel ( 3으로 가정)
c : intput_dimension (channel ) (100으로 가정)
m : output_dimension (activation map) (1000으로 가정)
pointwise_convolution = nn.Conv2d(in_channels=100, out_channels=1000, kernel_size=1, bias=False)
----------------------------------------------------------------
Layer (type) Output Shape Param #
================================================================
Conv2d-1 [-1, 1000, 17, 17] 100,000
================================================================
Total params: 100,000
Trainable params: 100,000
Non-trainable params: 0
----------------------------------------------------------------
Input size (MB): 0.11
Forward/backward pass size (MB): 2.20
Params size (MB): 0.38
Estimated Total Size (MB): 2.70
----------------------------------------------------------------
4. Depthwise Separable Convolution
Depthwise Separable Convolution = K * K * C + C * M = C( K * K + M )
k : Kernel ( 3으로 가정)
c : intput_dimension (channel ) (100으로 가정)
m : output_dimension (activation map) (1000으로 가정)
depthwise_separable_convolution = nn.Sequential(
nn.Conv2d(in_channels=100,
out_channels=100,
kernel_size=3,
groups=100,
bias=False),
nn.Conv2d(in_channels=100,
out_channels=1000,
kernel_size=1,
bias=False)
)
----------------------------------------------------------------
Layer (type) Output Shape Param #
================================================================
Conv2d-1 [-1, 100, 15, 15] 900
Conv2d-2 [-1, 1000, 15, 15] 100,000
================================================================
Total params: 100,900
Trainable params: 100,900
Non-trainable params: 0
----------------------------------------------------------------
Input size (MB): 0.11
Forward/backward pass size (MB): 1.89
Params size (MB): 0.38
Estimated Total Size (MB): 2.38
----------------------------------------------------------------
Depthwise Separable Convolution = Depthwise Convolution + Pointwise Convolution ( 100900 = 100000 + 900 )
Standard Convolution Parameters = 900,000
Depthwise Separable Convolution Parameters = 100,900
=> 약 K(Kernel Size) 제곱의 차이
5. Kernel Size가 값이 굉장히 크다면... ( kerenl size == 7 )
Standard Convolution
----------------------------------------------------------------
Layer (type) Output Shape Param #
================================================================
Conv2d-1 [-1, 1000, 11, 11] 4,900,000
================================================================
Total params: 4,900,000
Trainable params: 4,900,000
Non-trainable params: 0
----------------------------------------------------------------
Input size (MB): 0.11
Forward/backward pass size (MB): 0.92
Params size (MB): 18.69
Estimated Total Size (MB): 19.73
----------------------------------------------------------------
Depthwise separable Convolution
----------------------------------------------------------------
Layer (type) Output Shape Param #
================================================================
Conv2d-1 [-1, 100, 11, 11] 4,900
Conv2d-2 [-1, 1000, 11, 11] 100,000
================================================================
Total params: 104,900
Trainable params: 104,900
Non-trainable params: 0
----------------------------------------------------------------
Input size (MB): 0.11
Forward/backward pass size (MB): 1.02
Params size (MB): 0.40
Estimated Total Size (MB): 1.53
----------------------------------------------------------------
Kernel의 사이즈가 커질수록, 엄청난 파라미터 수의 감소를 보여주며, 곱셈을 덧셈으로 대체하기 때문에 연산이 굉장히 빨라집니다.
이러한 특징덕에 의해, Depthwise separable Convolution를 통한 Inception, Xception, mobile net 등 여러 논문에서 많이 등장합니다.