일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- feature map
- SQLD 후기
- Inductive Bias
- BFS
- SQL
- 1x1 Convolution
- skip connection
- CROSS JOIN
- depthwise convolution
- mobilenet
- Two Pointer
- Depthwise Separable Convolution
- get_dummies()
- dfs
- dp
- 식별자
- 데이터모델링
- 백준
- outer join
- bottleneck
- numpy
- pytorch
- 인접리스트
- SQLD
- 정규화
- 인접행렬
- 그래프
- 연산량 감소
- resnet
- 엔터티
- Today
- Total
SJ_Koding
Grouped convolution의 설명 및 PyTorch 예시 본문
- 부제: ConvNeXt 이해하기 4편 -
연산량 감소를 위한 다양한 convolution이 있다. 아래의 글 처럼 말이다.
1. 1x1 convolution (연산량 감소 기법에 정말 많이 사용되는 convolution 필터, 꼭 알아둬야 함)
2. Bottleneck block (resnet)
3. Depthwise separable convolution (MobileNet)
그리고 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)
'Deep Learning' 카테고리의 다른 글
ConvNeXt (A ConvNet for the 2020s, facebook) 논문 리뷰 (0) | 2024.04.04 |
---|---|
manifold와 Inverted Bottleneck의 설명 (1) | 2024.04.04 |
Depthwise (Separable) Convolution의 설명 및 Pytorch 예시 (0) | 2024.04.03 |
Bottleneck 구조(resnet)의 설명 및 Pytorch 예시 (0) | 2024.04.03 |
1x1 convolution의 설명 및 Pytorch 예시 (0) | 2024.04.03 |