Search
Duplicate
⚙️

Depthwise convolution이란?

정의

PyTorch를 예로 들자면, nn.Conv1dgroups 파라미터가 아래 조건을 만족하면 이러한 convolution 연산을 depthwise convolution이라 한다.
groups == in_channels
groups == out_channels * K (K는 양의 정수)
‘Depthwise’라는 용어 때문에 바로 이해가 되지는 않는다. ‘Channelwise’ convolution 이었다면 이해가 더 쉽지는 않았을까?

코드로 이해해보자

직접 nn.Conv1d를 만져보면서 이해해보자.
길이 10짜리 DNA 서열이 있다고 해 보자.
x = torch.randn([1, 4, 10])
Python
복사

일반적인 Convolution filter의 weight 모양

여기에 일반적인 (groups=1) 1D-convolution 연산을 수행하려면 아래와 같이 연산을 만들면 된다. (out_channels=4, kernel_size=3이라고 하자)
conv = nn.Conv1d(4, 4, 3) conv(x).shape # (1, 4, 8)
Python
복사
Weight를 찍어보면 어떻게 생겼을까?
크기 4x3(kernel_size)인 filter가 4개(out_channels) 있어야 하니까, (4, 4, 3)일 것.
conv.weight.shape # (4, 4, 3)
Python
복사

Depthwise convolution filter의 weight 모양

Depthwise convolution 연산을 다음과 같이 정의해보자.
groups = in_channels = 4, groups = out_channels * 1 이므로 depthwise conv다.
d_conv = nn.Conv1d(4, 4, 3, groups=4) d_conv(x).shape # (1, 4, 8)
Python
복사
Output의 크기는 (1, 4, 8)로 일반적인 convolution 연산의 결과와 다르지 않다.
Weight를 보면 어떨까?
conv.weight.shape # (4, 1, 3)
Python
복사
(4, 1, 3)으로, 크기가 1x3 인 filter가 4개 있다.