Pytorch 공식 문서와 함께하는 Pytorch 튜토리얼_3(Transform)

bellfollow·2023년 8월 22일
0

Pytorch_tutorial

목록 보기
4/7
post-thumbnail

변형(Transform)

  • 데이터가 항상 머신러닝 알고리즘 학습에 필요한 최종 처리가 된 형태로 제공되지 않기에 변형을 해서 데이터를 조작하고 학습에 적합하게 만들어야함
  • 모든 TorchVision 데이터셋들은 변형 로직을 갖고, 호출 가능한 객체를 받는 매개 변수 두개 [ (feature)를 변경하기 위한 transform과 정답(label)을 변경하기 위한target_transform ] 을 갖습니다.
    -torchvision.transforms 모듈은 주로 사용하는 몇가지 변형을 제공합니다.
  • FashionMNIST의 feature은 PIL Image(Python image library)s 형식이며, label은 정수(integer)형입니다.
    - 학습을 하려면 정규화(normalize)된 텐서 형태의 특징(feature)과 원-핫(one-hot)으로 부호화 된 텐서 형태의 정답이 필욯바니다.
    -이러한 변형을 하기위해 ToTensorLambda를 사용합니다.
    • one-hot: 원-핫 인코딩은 단어 집합의 크기를 벡터의 차원으로하고, 표현하고 싶은 단어의 인덱스에 1의 값을 부여하고, 다른 인덱스에는 0을 부여하는 단어의 벡터 표현 방식입니다.
  • 코드
import torch
from torchvision import datasets
from torchvision.transforms import ToTensor, Lambda

ds = datasets.FashionMNIST(
    root="data",
    train=True,
    download=True,
    transform=ToTensor(),
    target_transform=Lambda(lambda y: torch.zeros(10, dtype=torch.float).scatter_(0, torch.tensor(y), value=1))
    )
  • root 는 앞서 계속 봤듯 데이터가 있을 공간입니다.
  • train 는 훈련 여부입니다
  • downloda 는 root에 데이터가 없을 경우 인터넷을 통해 다운로드를 할지 말지를 결정합니다.
  • tranform = ToTensor() 는 데이터 형식을 텐서로 바꿔줍니다.
  • target_transform=Lambda(lambda y: torch.zeros(10, dtype=torch.float).scatter_(0, torch.tensor(y), value=1))
    - y는 입력 인수이며 대상 레이블 또는 클래스 인덱스를 나타내는 것입니다.
    - torch.zero(10,dtype=torch.float) 는 0으로 채워진 크기 10의 텐서이며 데이터 유형은 float형입니다.
    - .scatter_(0, torch.tensor(y),value=1) 는 이전 단게에서 생성한 텐서에 적용되는 메소드입니다. 이방법은 텐서의 지정된 차원을 따라 값을 분산시키는데 사용됩니다.
    -첫번째 인수 0은 값을 분산시킬 차원을 나타냅니다. 이경우 0은 첫번째 차원을 나타냅니다.
    -두번째 인수 torch.tensor(y)는 값이 분산될 인덱스를 포함하는 텐서입니다. y는 입력 클래스 색인입니다.
    -세 번째 인수 value=1는 지정된 인덱스에 할당될 값입니다.
    *torch.scatter는 index가 가르키는 위치에 특정 값을 대입하는 연산을 의미합니다. scatter는 흩뿌리다라는 의미를 가지듯 특정 인덱스에 특정 값을 대입하는 연산으로 값을 흩뿌린다고 생각하면 좋을것 같습니다.
    -이것은 또한 out-of-place 버전으로 별도 메도리를 할당받아 추가로 데이터를 만드는 버전이고 , torch.scatter_는 inplace버전으로 기존의 데이터에 그대로 사용하는 방법입니다.

ToTensor

-PIL Image나 Numpy ndarrayFloatTensor로 변환하고, 이미지의 픽셀의 크기(intensity)값을 [0.,1.] 범위로 비레하여 조정합니다.

Lambda 변형

  • Lambda 변형은 사용자 정의 람다 함수를 적용합니다. 여기서 정수를 one-hot으로 부호화된 텐서로 바꾸는 함수를 정의합니다. 이 함수는 먼저 (데이터셋 정답의 개수인) 크기 10인 zero tensor를 만들고, scatter_를 호출하여 주어진 정답 y에 해당하는 인덱스에 value = 1 을 할당합니다.

-코드(위에서 봄)

target_transform = Lambda(lambda y: torch.zeros(
    10, dtype=torch.float).scatter_(dim=0, index=torch.tensor(y), value=1))
profile
코딩 함 맛있게 요리해보겠심더

0개의 댓글