글의 가독성을 위해 아래 링크에 다시 정리함.
https://blog.naver.com/younjung1996/223413266165
안녕하세요. 오늘은 CNN에서 Depth-wise Separable Convolution에 대해 이야기해보겠습니다.
Depth-wise separable Convolution을 가장 잘 표현한 그림이라고 생각합니다.
하지만 CNN에 대해 자세한 이해가 없으면 이 그림을 보더라도 이해가 잘 가지 않습니다.
위 그림을 이해하기 위해서는 Standard(일반) Convolution을 정확히 파악해야 합니다.
위 gif는 제 PPT 내용을 짜집어서 Standard Convolution 연산을 설명한 것입니다.
기본적으로 하나의 Convolution을 통과하면 하나의 Feature Map(Activation Map)이 생성됩니다.
( pytorch에서 out_channels을 통해 Feature Map의 개수를 정할 수 있습니다. )
이때 Feature Map 한 개를 생성하는데 Kernel Size x Kernel Size x Input Channel(입력 이미지 개수)의 Parameter가 필요합니다.
1. Standard Convolution vs Depth-wise Convolution
(색으로 비교하시면서 보십시오. )
하나의 Feature Map = Kernel Size x Kernel Size x 3
반면, Depth-wise은 아래와 같습니다.
차이를 아시겠나요?
Depth-wise Convolution은 한 번 통과하면, 하나로 병합되지 않고, (R, G, B)가 각각 Feature Map이 됩니다.
3 x Feature Map = Kernel Size x Kernel Size x 3
정리하게 되면,
하나의 Feature Map = Kernel Size x Kernel Size
두 개를 논문 Figure로 비교하면,
Depth-wise Convolution에서 연산량이 Input Channel 만큼 연산량이 줄어듭니다.
2. Separable Convolution
Separable Convolution은 Point-wise Convolution 입니다.
Point-wise Convolution는 1x1 Convolution입니다.
1x1 Convolution의 역할을 자세히 알고 싶으시다면 위 글을 참고하시기 바랍니다.
1x1 Convolution은 두 가지 특성을 가지고 있습니다 .
(1) 공간적인 특성을 가지고 있지 않다.
(2) 연산량이 가장 적게 필요로 하기 때문에, Feature Map 개수를 조절할 때 사용된다.
3. Depth-wise Separable Convolution
(2) Pointwise Convolution에서 BottleNeck구조를 이해하셨으면, 바로 감이 오실 겁니다.
BottleNeck의 구조 핵심은 연산량이 높은 곳은 최대한 Feature Map을 적게 생성하고, 연산량이 낮은 곳에서 Feature Map을 가지고 노는 것입니다.
Depth-wise Convolution이 연산량이 적다 하더라도, Point-wise Convolution에 비하면 연산량이 굉장히 많은 편입니다.
Depth-wise Convolution에서 Feature Map을 최대한 적게 뽑아내고, Point-wise Convolution에서 Feature Map을 필요한 만큼 뽑아냅니다.
3. vs Depth-wise Separable Convolution
두 식을 정리하면, 최종적으로 곱셈이 덧셈으로 바뀌게 됩니다.
보통 Kernel Size보다 Output Channel이 훨씬 크기 때문에 계산해보면 약 Kernel size 제곱만큼의 차이가 발생합니다.
이를 Pytorch로 구현하는 방법은 간단합니다.
class depthwise_separable_conv(nn.Module):
def __init__(self, input_dim, output_dim):
super(depthwise_seperable_conv, self).__init__()
self.depthwise = nn.Conv2d(input_dim, input_dim, kernel_size=3, padding=1,
groups=input_dim)
self.pointwise = nn.Conv2d(input_dim, output_dim, kernel_size=1)
def forward(self, x):
x = self.depthwise(x)
x = self.pointwise(x)
return x
Convolution에서 groups라는 인자가 있습니다.
말 그대로 Input Channel을 얼마만큼 그룹 지어서 출력할지 정하는 인자입니다.
Group을 최대로 지으면, 결국 서로 각각의 독립적인 계산을 하게 됩니다.
아래 Pytorch Document를 참고하시면 좋습니다.
pytorch.org/docs/stable/generated/torch.nn.Conv2d.html?highlight=conv2d#torch.nn.Conv2d
'Python > Deep Learning' 카테고리의 다른 글
[Pytorch] RNN에서 Tanh말고 Sigmoid나 ReLU를 사용하면 안될까? (0) | 2021.02.04 |
---|---|
[Pytorch] LSTM을 이용한 삼성전자 주가 예측하기 (33) | 2021.02.02 |
[딥러닝] DeepLearning CNN BottleNeck 원리(Pytorch 구현) (0) | 2021.01.13 |
[딥러닝] 저해상도를 고해상도로 이미지 만들기(Preprocess)! Super Resolution! (1) | 2020.10.01 |
[딥러닝] ReLU 함수가 비선형 함수인 이유...! (선형함수와 비선형함수의 차이점) (0) | 2020.09.18 |