SJ_Koding

Grouped convolution의 설명 및 PyTorch 예시 본문

Deep Learning

Grouped convolution의 설명 및 PyTorch 예시

성지코딩 2024. 4. 3. 14:29

- 부제: ConvNeXt 이해하기 4편 -

연산량 감소를 위한 다양한 convolution이 있다. 아래의 글 처럼 말이다.

1. 1x1 convolution (연산량 감소 기법에 정말 많이 사용되는 convolution 필터, 꼭 알아둬야 함)

 

1x1 convolution의 설명 및 Pytorch 예시

부제: - ConvNeXt 이해하기 1편 - 1x1 convolution 1x1 convolution은 필터 사이즈가 1x1라는 것을 의미한다. 즉, feature map의 feature 하나(Image Input기준으로 픽셀 하나) 에 대해 convolution 연산을 진행한다. 1x1 convol

sjkoding.tistory.com

2. Bottleneck block (resnet)

 

Bottleneck 구조(resnet)의 설명 및 Pytorch 예시

부제: - ConvNeXt 이해하기 2편 - Bottleneck이란 용어 자체는 병목현상을 의미한다. 정말 많은 분야에서 쓰이는 말이다. 시스템 분야에서의 병목현상은 다음과 같이 정의된다. - 시스템 내에서 전체적

sjkoding.tistory.com

3. Depthwise separable convolution (MobileNet)

 

Depthwise (Separable) Convolution의 설명 및 Pytorch 예시

- 부제: ConvNeXt이해하기 3편 - Xception에서 제시된 컨셉으로 유명해졌다. 쉽게 이해할 수 있다. 먼저 Depthwise convolution을 알기 전에 일반적인 Convolution 연산을 알아보자. 기본적인 개념으로 Input channel

sjkoding.tistory.com

 

그리고 4. Grouped convolution (AlexNet)

Grouped convolution은 채널을 N개의 그룹으로 나누어 각각의 kernel을 통해 convolution연산을 진행하는 것이다.

정말 간단하지만 수식적으로 연산량이 줄어듦을 금방 알 수 있다. 먼저 Grouped convolution의 그림을 보자면

 

이런식으로 kernel를 채널의 그룹별로 동일하게 나누어 연산을 진행하는 개념이다. 그렇다면 일반 convolution 연산과 얼마나 연산량이 차이나는지 확인하자.

Grouped convolution 연산량

IC : Input Channel
OC: Output Channel
H: height of feature map
W: width of feature map
K: kernel size

standard convolution 연산량 == IC * OC * H * W * K * K

Grouped convolution 연산량(Group 개수 == 4 일 경우)

IC/4 * OC/4 * H * W * K * K * 4 == (IC * OC * H * W * K * K) / 4

 

단순히 계산해봐도 그룹을 4개로 가질 경우 1/4배의 연산량을 가질 수 있다.

Grouped convolution 단점

하지만 Grouped convolution의 단점도 당연히 존재한다. 

1. 어쨋든 Hyper parameter(그룹의 수)이라는 것. 튜닝에 피로도가 소요된다. 그룹의 수에 따라 성능이 좌지우지 되기 때문이다.

2. 너무 과한 Grouping은 충분한 채널을 가지지 못해 성능 저하의 원인이 되고, 이는 결국 작은 채널을 가지는 모델들의 앙상블과 유사한 결과를 낫는다.

 

Grouped convolution PyTorch

import torch
import torch.nn as nn

# Grouped Convolution Layer 정의
class GroupedConvolution(nn.Module):
    def __init__(self, in_channels, out_channels, kernel_size, groups):
        super(GroupedConvolution, self).__init__()
        self.conv = nn.Conv2d(in_channels=in_channels, out_channels=out_channels,
                              kernel_size=kernel_size, groups=groups) # 여기가 핵심! groups매개변수

    def forward(self, x):
        return self.conv(x)

# in_channels = 8, out_channels = 8, kernel_size = 3, groups = 4
grouped_conv = GroupedConvolution(8, 8, 3, 4)

input_tensor = torch.randn(1, 8, 32, 32)

# Grouped Convolution 적용
output_tensor = grouped_conv(input_tensor)