정의
•
PyTorch를 예로 들자면, nn.Conv1d의 groups 파라미터가 아래 조건을 만족하면 이러한 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개 있다.