본문 바로가기
AI Research/Deep Learning

[딥러닝 기본지식] 다양한 Convolution 기법_with Pytorch (1)

by ga.0_0.ga 2023. 4. 22.
728x90
반응형

이전에 합성곱 신경망(CNN)의 기초에 대해 설명했었는데요! 이번 글에서는 딥러닝에서 사용되는 다양한 Convolution 기법들에 대해서 설명하겠습니다!

 

컴퓨터 비전 분야에서 CNN이 등장한 이후 많은 task에서 꽤 높은 성능 향상 결과를 얻을 수 있었습니다. kernel의 크기를 키워 receptive field를 확장한다던지, 더 깊이 레이어를 쌓는다던지 하는 방법들이 적용되어왔습니다. 하지만 연산량의 증가나 기울기 소멸, 정보 손실같은 문제가 발생해 한계점이 존재하기도 합니다. 

따라서, 이런 문제점을 해결하기 위해 등장한 다양한 Convolution 기법들을 소개하겠습니다! 소개할 Convolution들은 다음과 같습니다.

- Transposed Convolution( Deconvolution )

- Dilated Convolution (Atrous Deconvolution)

- Depthwise Convolution

- Seperable Convolution

- Depthwise Separable Convolution

- Pointwise Convolution

- Grouped Convolution

- Deformable Convolution

 

 

1. Transposed Convolution( Deconvolution )

 Transposed Convolution은 Deconvolution이라는 이름으로 많이 불리기도 합니다. 하지만 실제 deconvolution과는 상당한 차이가 존재합니다. 실제 deconvolution은 말 그대로 convolution과정을 거꾸로 되돌리는 작업입니다. 하지만 convolution과정을 거치면 정보가 어느 정도 손실되게 되고 따로 원본 정보가 저장되어 있지 않는 한은 이를 완벽히 되돌리는 것은 불가능하기 때문에 실제로 사용되는 경우는 거의 없습니다. 다만, Transposed convolution과 deconvolution은 결과물로 동일한 공간 차원을 만들어내기 때문에 혼용되어 사용되는 듯 합니다. 

Convolution과 Transposed Convolution을 비교해보겠습니다. 아래는 Convolution의 연산이 진행되는 그림입니다.

Convolution 연산

결과물로 나온 분홍색 행렬을 Transposed Convolution을 이용해 다시 되돌려보겠습니다. 아래 그림에서 알 수 있듯이 새로운 kernel인 sparse matrix와 convolution의 결과물이었던 행렬과 4*1 연산을 통해 기존 convolution의 입력 크기였던 16*1 matrix를 구해냅니다. 

Transposed Convolution

Transposed Convolution이 사용될 수 있는 CNN에는 AutoEncoder가 있습니다. encoder에서 이미지를 압축하고 decoder에서 다시 up-sampling해야 하는데 이때 사용될 수 있습니다. Pytorch에서는 Transposed Convolution을 수행할 수 있는 클래스를 제공하고 있습니다.

torch.nn.ConvTranspose2d(in_channels, out_channels, kernel_size, stride=1, padding=0, output_padding=0, groups=1, bias=True, dilation=1, padding_mode='zeros', device=None, dtype=None)

 

 

2. Dilated Convolution (Atrous Deconvolution)

Dilated Convolution은 쉽게 말해 kernel이 수용하는 픽셀 영역들 사이를 띄어 간격을 두는 기법입니다. 띄어진 공간은 zero padding됩니다.

Dilated Convolution (Atrous Deconvolution)

이 컨볼루션에 입력되는 픽셀수는 동일하지만, 결과적으로 더 넓은 범위에 대한 입력을 수행할 수 있도록 해줍니다. Receptive field가 커지기 때문에 전체적인 특징을 잘 잡아낼 수 있습니다. 기존의 컨볼루션에서 receptive field를 크게 하려면 kernel의 크기를 키우는 수 밖에 없었는데 이는 연산량의 증가를 가져옵니다. 따라서, Dilated Convolution은 연산량의 증가없이 receptive field를 키울 수 있는 방법 중 하나라고 할 수 있겠습니다. Pytorch에서 사용하려면 아래의 dilation파라미터를 세팅해주면 됩니다!

torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True, padding_mode='zeros', device=None, dtype=None)

 

 

3. Depthwise Convolution

기본적으로 Convolution연산은 하나의 kernel이 모든 채널의 feature맵을 훑기 때문에 특정 채널의 정보만을 담게 하는 것은 불가능합니다. 하지만 Depthwise Convolution은 채널 하나씩에만 필터가 사용될 수 있도록 했습니다. 모든 kernel이 모든 채널을 살펴볼 필요가 없기 때문에 연산량이 상당히 감소했고, 이로 인해 실시간 task에서도 사용가능 하다고 합니다!

Depthwise Convolution

위 그림은 3*8*8의 feature map에 3*3*3 크기의 kernle을 적용해 Depthwise Convolution을 수행하는 그림입니다. 원래의 convolution과 다르게 kernel하나가 차원 1개의 feature map에만 적용되었고 각각의 결과물들이 붙어 최종 출력을 내는 것을 확인할 수 있습니다. 즉, 채널 방향의 연산은 없고, spatial 방향의 연산만 진행합니다. 때문에 각 kernel은 하나의 채널에 대해서만 파라미터를 가지고 따라서, 입출력의 채널수가 동일해야 합니다. Pytorch에서 사용하려면 아래의 groups 파라미터를 입력 채널수와 동일하게 설정해주면 됩니다.

torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True, padding_mode='zeros', device=None, dtype=None)

 

 

4. Seperable Convolution

Seperable Convolution은 kernel 작업을 여러 단계로 나눠 수행하는 방법입니다.  원본의 kernel 하나를 두 개의 작은 kernel로 나누면 연산량도 줄어들고 네트워크를 더 빠르게 실행 시킬 수 있습니다.
원래의 convolution연산은 y=conv(x, k)로 표현될 수 있습니다. 이때, x는 입력 feature, k는 kernel , y는 출력 feature를 의미합니다. kernel에서 수행되는 연산을 k=k1.dot(k2)라고 한다면 k1과 k2로 각각 1D Convolution 연산 하는 것과 동일한 결과를 가져올 수 있다고 합니다. 

Seperable Convolution

위 그림에서 보면 원래의 Convolution연산은 3*3 kernel을 한번에 적용하여 총 9번의 곱셈을 진행해야 합니다. 하지만 Seperable Convolution에서는 3번의 곱셈은 2번의 Convolution만 수행하여 동일한 결과를 얻었습니다.

 

 

 

나머지 Depthwise Separable Convolution, Pointwise Convolution, Grouped Convolution, Deformable Convolution은 다음 포스팅에 이어서 진행하겠습니다 :)

 

 

 

본 포스팅은 아래의 글들을 참고하여 작성하였습니다 :)

https://zzsza.github.io/data/2018/02/23/introduction-convolution/

https://eehoeskrap.tistory.com/431

https://coding-yoon.tistory.com/122

https://velog.io/@hayaseleu/Transposed-Convolutional-Layer%EC%9D%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80

728x90
반응형

댓글