그림과 같이 빨간색 자동차 이미지가 있을 때 적색 값들 분포가 높습니다. 반면 녹색과 청색은 낮습니다. 정규화를 거치고 나면 모든 색의 분포가 정규분포를 따르게 됩니다. 이렇게 색이 정규 분포를 따르도록 값을 바꾸면 색도 변합니다. 정규화를 거치면 색이 변하더라도 인공지능 입장에서는 색이 갖는 분포가 일정해야 학습을 제대로 할 수 있습니다.
import matplotlib.pyplot as plt
import torchvision.transforms as T
from torchvision.datasets.cifar import CIFAR10
from torchvision.transfomrs import Compose
from torchvision.transfomrs import RandomHorizontalFlip, RancomCrop, Normalize
#데이터 전처리에 정규화 추가
transforms = Compose([
T.ToPILImage(),
RandomCrop((32, 32), padding=4),
RandomHorizontalFlip(p=0.5),
T.ToTensor(),
#데이터 정규화(mean=평균, std=표준분포)
Nomalize(mean(0.4914, 0.4822, 0.4465, std=(0.247, 0.243, 0.261)),
T.ToPILImage()
])
상기 코드는 이미지를 정규화하는 코드입니다. 정규분포는 평균과 표준 편차로 나타내는데 mean은 평균을, std는 표준편차를 나타냅니다. 괄호 안의 값들은 차례대로 R, G, B 채널의 값을 의미하고 데이터셋에 따라 값들이 달라지기 때문에 직접 구해야 하지만 유명 데이터셋의 값을 사용하는 경우도 있습니다.
설명 : 평균 mean, 표준편차 std를 갖는 정규분포가 되도록 정규화를 실행합니다.
제공 라이브러리 : torchvision.transforms
데이터셋의 평균과 표준편차를 구하는 코드
import torch
traning_data = CIFAR10(
root="./",
train=True,
download=True,
trasform=ToTensor())
# item[0]은 이미지, item[1]은 정답 레이블
imgs = [item[0] for item in traning_data]
#imgs를 하나로 합침
imgs = torch.stack(imgs, dim=0).numpy()
# rgb 각 평균
mean_r = imgs[:,0,:,:].means()
mean_g = imgs[:,1,:,:].means()
mean_b = imgs[:,2,:,:].means()
print(mean_r, mean_g, mean_b)
# rgb 각 표준편차
std_r = imgs[:,0,:,:].std()
std_g = imgs[:,1,:,:].std()
std_b = imgs[:,2,:,:].std()
print(std_r, std_g, std_b)
0.49139968 0.48215827 0.44653124
0.24703233 0.24348505 0.26158768
임베딩(embeddings) (0) | 2023.09.25 |
---|---|
오토인코더(AutoEncoder) (0) | 2023.09.25 |
Intersection over Union (IoU) (0) | 2021.07.25 |
YOLOv4 Traning (0) | 2021.06.27 |
시계열 Time Series (0) | 2021.06.07 |
댓글 영역