[5 1] vggnet 구현
[5 1] vggnet 구현
과제
Transforms.Normalize() 함수 이용
Transforms.Normalize?
Transforms.Normalize는 PyTorch의 torchvision 모듈에서 제공하는 이미지 정규화 함수입니다. 주로 딥러닝 모델에 이미지를 입력하기 전 데이터 전처리 파이프라인에 포함되며, 이미지의 각 채널(RGB)별로 평균과 표준편차를 사용하여 데이터를 정규화합니다.
Transforms.Normalize의 역할 및 동작 방식
- 목표: 모델 학습 시 데이터의 분포를 안정시켜 학습 효율을 높이고, 특정 값의 범위에 민감한 모델이 데이터를 고르게 학습할 수 있도록 돕습니다.
- 정규화 공식: 각 이미지 채널의 픽셀 값 x를 평균(mean)과 표준편차(std)를 이용해 정규화합니다.
- ToTensor와의 순서: Transforms.Normalize는 텐서(Tensor)에 적용되는 함수이므로, 이미지를 텐서로 변환하는 transforms.ToTensor() 뒤에 위치해야 합니다.
- transforms.Normalize()는 이 텐서에 다시 평균과 표준편차를 적용해 특정 범위(예: -1~1)로 정규화합니다.
데이터 전처리 파이프라인 예시
이미지 전처리를 위한 파이프라인은 transforms.Compose를 사용하여 여러 단계를 결합하여 구성할 수 있습니다. 다음은 그 예시입니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
from torchvision import transforms
# 전처리 파이프라인 정의
transform = transforms.Compose([
transforms.Resize((224, 224)), # 이미지 크기 조절
transforms.ToTensor(), # 이미지를 텐서로 변환 (0~1)
transforms.Normalize(
mean=[0.485, 0.456, 0.406], # ImageNet 데이터셋의 평균
std=[0.229, 0.224, 0.225] # ImageNet 데이터셋의 표준편차
)
])
# 학습 데이터셋에 전처리 파이프라인 적용
# train_data = datasets.ImageFolder("data/train", transform=transform)
[PyTorch] 이미지 픽셀의 평균, 표준편차를 계산하여 정규화하기
1. 데이터 불러오기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# loading training data
from torchvision import datasets
import torchvision.transforms as transforms
import os
path2data = '/data'
# if not exists the path, make the path
if not os.path.exists(path2data):
os.mkdir(path2data)
data_transformer = transforms.Compose([transforms.ToTensor()])
train_ds = datasets.STL10(path2data, split='train', download='True', transform=data_transformer)
print(train_ds.data.shape)
# (5000, 3, 96, 96)
2. train_ds의 평균과 표준편차를 계산합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import numpy as np
meanRGB = [np.mean(x.numpy(), axis=(1,2)) for x,_ in train_ds]
stdRGB = [np.std(x.numpy(), axis=(1,2)) for x,_ in train_ds]
meanR = np.mean([m[0] for m in meanRGB])
meanG = np.mean([m[1] for m in meanRGB])
meanB = np.mean([m[2] for m in meanRGB])
stdR = np.mean([s[0] for s in stdRGB])
stdG = np.mean([s[1] for s in stdRGB])
stdB = np.mean([s[2] for s in stdRGB])
print(meanR, meanG, meanB)
print(stdR, stdG, stdB)
3. normalize transformation을 적용합니다.
1
2
3
4
5
6
7
8
train_transformer = transforms.Compose([
transforms.RandomHorizontalFlip(),
transforms.RandomVerticalFlip(),
transforms.ToTensor(),
transforms.Normalize([meanR, meanG, meanB], [stdR, stdG, stdB])
])
train_ds.transform = train_transformer
This post is licensed under CC BY 4.0 by the author.