일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- dp
- skip connection
- 식별자
- depthwise convolution
- Two Pointer
- numpy
- outer join
- 데이터모델링
- SQLD
- CROSS JOIN
- SQL
- resnet
- Inductive Bias
- 인접행렬
- 엔터티
- 정규화
- 1x1 Convolution
- 인접리스트
- BFS
- mobilenet
- bottleneck
- 연산량 감소
- feature map
- Depthwise Separable Convolution
- 백준
- 그래프
- SQLD 후기
- get_dummies()
- dfs
- pytorch
- Today
- Total
SJ_Koding
1x1 convolution의 설명 및 Pytorch 예시 본문
부제: - ConvNeXt 이해하기 1편 -
1x1 convolution
1x1 convolution은 필터 사이즈가 1x1라는 것을 의미한다. 즉, feature map의 feature 하나(Image Input기준으로 픽셀 하나) 에 대해 convolution 연산을 진행한다. 1x1 convolution은 정말 많은 곳에서 볼 수 있는데, 대표적으로 bottleneck 구조나 depthwise-convolution 차원축소를 해야하는 경우에 빈번하게 사용된다.
참고로 GoogleNet에서 1x1 convolution을 사용하면서 널리 알려지고 사용하게 되었다.
위 그림은 채널이 3인 Input이 주어질때, 3x3 convolution을 수행한 것이다.
반면, 위 그림은 1x1 convolution을 의미하며 일반적인 conv 연산과 동일한데, 단지 필터사이즈가 1x1인 것이다. 위 그림에서 Input의 채널이 192이므로 이때 만약 128채널로 줄이고 싶으면 1x1 convolution filter를 128개를 만들어 연산하면 되는것이다. 위 그림은 설명을 위해 1x1 convolution filter를 하나 통과시켰을때의 결과(초록색 네모)를 시각화하였다.
차원을 줄이기만 하느냐?
그렇지 않다. 당장 bottleneck구조만 보더라도 차원을 늘리는경우도 있다. 특히 inverted bottleneck구조에서 1x1으로 차원을 늘리고 피처추출을 진행한다. (추후 포스팅 참고) 사실 결론적으로는 연산량이 감소된다.
왜? Why?
1x1 convolution을 쓰는 이유는 대표적으로 세 가지가 있다.
1. 연산량을 줄일 수 있어요!
2. 활성화함수를 추가할 수 있어서 비선형성이 늘어나요!
하단 코드 예시 참고
3. 차원을 줄이면서 중요 피처를 다시 한 번 manifold할 수 있어요! (적절한 축소로 정보손실 최소화 요망,
연산량과 정보량 trade-off)
1x1 convolution도 하나의 레이어이기 떄문에 바로 뒤에 Activation function을 추가해도 무방하다. 즉, ReLU와 같은 활성화함수를 더욱 많이 쌓을 수 있으므로 비선형성이 더욱 증대된다. (하지만 ConvNext에서는 활성화함수를 줄여 성능향상을 시킴)
Example Code
import torch
import torch.nn as nn
class Conv1x1Example(nn.Module):
def __init__(self, in_channels, out_channels):
super(Conv1x1Example, self).__init__()
# 1x1 컨볼루션 정의: 입력 채널 수에서 출력 채널 수로 조절
self.conv1x1 = nn.Conv2d(in_channels, out_channels, kernel_size=1)
self.relu = nn.ReLU()
def forward(self, x):
x = self.conv1x1(x)
x = self.relu(x)
return x
model = Conv1x1Example(in_channels=64, out_channels=32)
input_tensor = torch.randn(1, 64, 56, 56)
output_tensor = model(input_tensor)
print("입력 텐서 크기:", input_tensor.shape) # 1, 64, 56, 56
print("출력 텐서 크기:", output_tensor.shape) # 1, 32, 56, 56
# 1x1 convolution이므로 same padding 적용을 안해도 width, height는 유지됨
'Deep Learning' 카테고리의 다른 글
ConvNeXt (A ConvNet for the 2020s, facebook) 논문 리뷰 (0) | 2024.04.04 |
---|---|
manifold와 Inverted Bottleneck의 설명 (1) | 2024.04.04 |
Grouped convolution의 설명 및 PyTorch 예시 (1) | 2024.04.03 |
Depthwise (Separable) Convolution의 설명 및 Pytorch 예시 (0) | 2024.04.03 |
Bottleneck 구조(resnet)의 설명 및 Pytorch 예시 (0) | 2024.04.03 |