Post

[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.