[PT_S] Pytorch Study - Day 2

박인성 (Bahk InSung)·2022년 8월 25일

Pytorch_Study

목록 보기
2/3
post-thumbnail

자 이제 부터 torch에서 데이터를 어떻게 다루고 어떻게 사용해야하는지에 대해서 다뤄보겠다. 아, 참 그리고 키보드 샀다... ㅎ... 신난다

Pytorch 에서는 총 3개의 라이브러리를 통해서 Datasets sample를 제공한다.

TorchVision, TorchText, TorchAudio

위 3개의 라이브러리의 이름에서도 알 수 있듯이 Vision, Text, Audio 데이터셋 샘플을 제공한다. Vison은 이미지, 영상 처리에 주를 이루고 Text는 자연어 처리, Audio는 음성인식 등이 있다.

👀📲 TorchVision

단순 데이터셋 뿐만 아니라, 변형을 위한 메소드 등도 제공을 하고 있다. 이 전에 torch 모듈만 설치를 했다면 TorchVision은 따로 설치를 해줘야 한다. 그렇기에 만일 설치가 안되어 있다면 아래 명렁어를 통해서 설치를 해줘야한다.

- Anaconda
conda install torchvision -c pytorch

- pip
pip install torchvision

참고로 자신의 파이썬 설치 및 환경에 따라 pip 혹은pip3로 작동하는 경우가 있으니 이 부분은 알아서 잘 확인하고 사용하시길 바란다.

위 명령어를 통해 정상적으로 설치가 완료 되었다면 PytorchVision 라이브러리 사용이 가능하다. 혼용되는 부분이 하나 있어 짚고 가자면 파이썬에서는 라이브러리 개념과 모듈 개념이 동시에 쓰인다. 이 부분에 대해서는 추후 다른 글을 적어서 정리할 예정이니 일단 알아만 둬라. 유사한 형태를 띄고 있고 사용하는 용도 또한 유사하되, 몇몇 부분이 다르기 때문에 참고하시길 바란다.

torchvision 모듈을 통해서 CIFAR 데이터 셋을 설치해보자. CIFAR는 32 * 32 크기, RGB 채널로 이루어진 이미지와 각 이미지의 라벨들이 붙여져 있는 데이터셋이다.

from torchvision import datasets

# CIFAR 
CIFAR_train = datasets.CIFAR10( 
    root="CIFAR",	# (str), 데이터셋이 저장될 경로, True 인 경우 루트 디렉토리에 생성
    train=True,		# (bool), True 인 경우, train set 에서 데이터 생성
    download=True	# (bool), True 인 경우, root 디렉토리에 데이터 다운로드
)

CIFAR_test = datasets.CIFAR10(
    root="CIFAR",
    train=False,	# (bool), Flase 인 경우, test set 에서 데이터 생성
    download=True
)

Files already downloaded and verified
Files already downloaded and verified

CIFAR 외에도 굉장히 다양히 많다. Pytorch API docs 를 보면 굉장히 많은 데이터셋이 있음을 확인 할 수 있다. 해당 데이터셋들은 모두 검증되고 여러 대회 및 논문에서도 쓰이는 데이터셋이기 때문에 신뢰 할 수 있다. 반드시 이 데이터셋을 갖고 학습을 할 필요는 없다. 자신이 학습 데이터를 이미 갖고 있다면 그 데이터를 이용해도 되지만 만일 없거나 해당 데이터셋이 필요한 경우에는 위와 같이 끌어올 수 있는 것 뿐이다.

📖 Parameters

datasets 에서 사용되는 Parameter들은 아래와 같다.

  1. root (string - required)
  2. train (bool - optional)
  3. download (callable - optional)
  4. transform (callable - optional)
  5. target_transform (bool - optional)

string, bool, callable은 입력 Parameter의 형식이다. optinal과 required는 필수적이진 않지만 개발자, 작성자의 원함에 따라 입력되는 Parameter이다. 반대로 required는 필수적이고 반드시 입력되어야 하는 Parameter이다.

root는 어디에 저장할 것인지, 일종의 directory 와 같다. trian 학습 데이터와 테스트 데이터를 나눌 것인지, download는 데이터셋을 다운로드 할 것인지에 대해서 정한다. 이때 download parameter를 True로 하면 이미 다운로드를 했건 안했건 다시 다운로드를 하고 False 혹은 따로 입력을 하지 않으면 없는 경우에만 다운로드를 한다.
transform은 이미지를 여러 변화를 할 것인가에 대한 parameter이다.

아래 사진는 Transform을 했을 경우의 이미지이다.

왼쪽이 Transform이 켜진 이미지, 오른쪽이 하지 않은 이미지이다. 보면 알 수 있듯이 확대 혹은 변형을 일으켜 데이터의 크기를 늘이게 된다. Parameter 형태는 callable 이기 때문에 RandomVerticalFilp(), RandomCrop() 와 같은 함수를 통해 변형할 수 있다.

그리고 마지막으로 target_transform 은 특정 Target, label만 변형을 시키는 Parameter이다.

그래서 변형을 하는 방법을 코드로 작성을 하면 아래와 같이 작성 할 수 있다.

cifar_test_RandomCrop = datasets.CIFAR10(
    root="CIFAR_RandomCrop",
    train=False,
    download=True,
    transform=RandomCrop(25)
)

✍️⌨️ TorchText

TorchText는 자연어처리를 위한 라이브러리로 Tokenization 등 다양한 자연어 처리에 필요한 데이터셋을 제공한다고 한다. 데이터셋 외에도 자연어처리에 필요한 함수, 기술 등 여러 기능들을 한번에 제공하기에 자연어 처리를 하고 있다면 반필수적으로 쓰이게 될 것이다.

하지만 유감스럽게도 저자는 자연어처리에는 큰 관심이 없어서 그냥 넘어가겠다.

🙉🎙 TorchAudio

TorchAudio는 음성인식을 주 로 다루고 있는 라이브러리 이다. 오디오, 신호 처리 등을 다루고 함수, 데이터셋, 모델 등을 함께 포함하고 있는 라이브러리이다. 자연어처리와 마찬가지로 단순 데이터셋 제공이 아닌 Audio에 필요한 함수, 기능들을 담고 있는 라이브러리 이다.

이 부분 또한 유감스럽게도 저자는 오디오처리, 음성처리에 대해서는 큰 관심이 없어 그냥 넘어가겠다...

🔨 Custom Data?! 📦

하지만 우리가 직접 모델을 개발하고 지내다보면 사실 위의 데이터는 공부할 때 빼고, 논문(?)을 쓸때 등 특이한 경우를 제외하고 직접 모델링을 할 때에는 크게 많이 쓰진 않는다. 단지 검증된 데이터가 있을 뿐이다.

그렇다면 우리가 Custom data를 갖고 어떻게 활용할 수 있고 우리의 데이터를 활용하기 위해서는 어떻게 해야할까?

torch.uilts🧨

많이 느끼는 부분이지만 Pytorch는 Class 개념이 굉장히 많이 활용이 된다. 그러다보니, 보통은 Model.py, Dataset.py, run.py 를 따로따로 두고 진행하는 경우가 많다.

그렇게 하면 관리하기도 쉬움과 동시에 여러명이서 개발을 할때 누군가 모델링에 굉장히 많은 심의를 기울이는 동안, 옆에서 데이터셋을 구성하고 Class과 파일 디렉토리만 넘겨주면 끝나기 때문에 이런 부분에 있어서는 Torch의 강점이 확연히 들어난다.

Custom Dataset를 구성하기 위해서는 아래와 같이 구성하면 된다.

class Dataset(uilts.data.Dataset):
	def __init__(self, x, y):
    	super(Dataset, self).__init__()
        
        self.x = x
        self.y = y
        
	def __getitem__(self, index):
    	return self.x[index], self.y[index]
        
    def __len__(self):
    	return len(self.x)

위와 같은 방법으로 불러오게 되는데 __init__에서 __이 쓰이는 이유는 파이썬 클래스의 메쏘드를 작성할때 문법적으로 이를 특별한 경우에 쓰이거나 Private 변수를 작성할 때 쓰이게 된다. 즉, 위 메쏘드들은 내부적으로 쓰이는 변수들이고 기본적인 데이터들의 형태를 반환해주는 메쏘드이다.

Dataset 이 이제 생겼다고 하자. 그러면 우리는 이제 Dataloader를 만들어야 한다. 이 부분 부터는 다음에 쭉 이어가는걸로..

profile
Just normal person, that know COBOL

0개의 댓글