본문 바로가기

명사 美 비격식 (무리 중에서) 아주 뛰어난[눈에 띄는] 사람[것]

Personal/Book

파이토치 딥러닝 마스터 - 1부 - 7장 새와 비행기 구별하기: 이미지 학습

MINIST: 손글씨 숫자 인식 데이터셋

CIFAR-100, CIFAR-10 그림 데이터셋 새로운 연구를 위한 개발검증으로 사용하기엔 단순하나 학습용으로 좋다. 

torch.utils.data.Dataset은 인기있는 컴퓨터 데이터셋에 미리 짜여진 절차에 따라 접근가능하다.  __len__, __getitem__은 아이템수와 샘플과 레이블로 이루어진 아이템을 반환한다. 

torchvision.transforms 데이터를 torch 형으로 변환할수있다.

transform.ToTensor넘파이 배열과이미지를 텐서로 바꿀 수있다.  출력차원레이아웃을 C*H*W 로 맞출 수있다.

transforms.Compose 변환

transforms.Normalize mean 평균과 std표준편차를 사용해 변환을 초기화할 수있다.

import torch
from torchvision import datasets, transforms
from torch.utils.data import DataLoader

# 데이터 전처리
transform = transforms.Compose([
    transforms.ToTensor(),                 # 이미지를 Tensor로 변환 (C × H × W)
    transforms.Normalize((0.5,), (0.5,))   # 평균(mean)=0.5, 표준편차(std)=0.5로 정규화
])

# MNIST 데이터셋 다운로드
train_dataset = datasets.MNIST(
    root="./data",
    train=True,
    download=True,
    transform=transform
)

test_dataset = datasets.MNIST(
    root="./data",
    train=False,
    transform=transform
)

# DataLoader 생성
train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True)

# 데이터 확인
images, labels = next(iter(train_loader))
print(images.shape)   # torch.Size([64, 1, 28, 28])
print(labels.shape)   # torch.Size([64])

 

 

nn.Softmax 출력을 확률로 표현하기

argmax() 제일 높은 확률에 대한 인덱스

pred = output.argmax(dim=1)

 

nn.NLLLoss Negative log Likeihood 음의 로그 우도 손실 함수, 정답 클래스의 로그 확률(log probability)에 음수(-)를 붙인 값

입력을 확률의 로그값으로 받으면 확률이 0에 가까울 경우 문제가 되고 nn.Softmax대신 nn.LogSoftmax를 사용해 계산을 안정적으로 수행하도록한다. 

SGD S는 확률적이라는 의미로써 섞은 데이터를 작은 미니배치 단위로 수행한다. 

Dataloader 데이터셋에서 미니배치에포함될 샘플을 가져올때 여러 샘플링 전략 중 하나를 고를 수있다. DataLoder생성자는 입력으로 Dataset 객체와 함께 batch_size와 shuffle을 입력받는다.  shuffle은 불리언 값으로 데이터가 각 에포크마다 섞어야할지를 지정한다. DataLoader는 순회가 가능하기 때문에새로운 훈련 코드의 루프 안에 넣어바로사용할수 있다. 

모델에 계층을 더 추가하면 모델의 깊이나 용량이 늘어나게 된다.

train_loader = DataLoader(
    train_dataset,
    batch_size=64,
    shuffle=True
)

for images, labels in train_loader:
    # 학습 수행
    pass

 

 

nn.LogSoftmax과 nn.NLLoss 조합은 nn.CrossEntropyLoss 와 동일하다. CrossEntropyLoss는 파이토치의 특징을 달 나타내며nn.NLLoss가 로그확률예측을 받아 크로스엔트로피를 계산하는 것과 다르게 CrossEntropy는 점수를 입력을 받는다. 일반적으로 신경망 마지막 계층에서는 nn.LogSoftmax 대신 손실값으로 nn.CrossEntropyLoss를 사용한다. 결과는 nn.LogSoftmax 및 nn.NLLoss와 돌일하나 한버네 모든걸 하면 모델의 출력 확률을 해석하지 못한다는 단점이있어 출력을 다시 소프트맥스에 명시적으로 연결할 필요가 있다.

output = model(x)
output = nn.LogSoftmax(dim=1)(output)
loss = nn.NLLLoss()(output, target)
logits = model(x)               # 모델 출력
loss = criterion(logits, target)

# 예측 확률이 필요할 때
prob = torch.softmax(logits, dim=1)
pred = prob.argmax(dim=1)