Pytorch

파이토치 기초 문법

술임 2022. 4. 28. 13:48

텐서 생성 및 변환

- 넘파이의 ndarray와 비슷

- GPU에서의 연산 가능

import torch
print(torch.tensor([[1,2],[3,4]])) # 2차원 텐서 생성
print(torch.tensor([[1,2],[3,4]], device="cuda:0")) # GPU에 텐서 생성
print(torch.tensor([[1,2],[3,4]], dtype=torch.float64)) # dtype을 사용해서 텐서 생성

 

- 텐서 넘파이 ndarray로 변환

temp =torch.tensor([[1,2],[3,4]])
print(temp.numpy())

 

텐서의 인덱스 조작

- 배열처럼 인덱스 바로 지정이나 슬라이스 사용 가능

torch.FloatTensor : 32비트 부동 소수점

torch.DoubleTensor : 64비트 부동 소수점

torch.LongTensor : 64비트 부호가 있는 정수

temp = torch.FloarTensor([1,2,3,4,5,6,7])
print(temp[2:5]) # 슬라이스로 접근

 

텐서 연산 및 차원 조작

- 텐서 간의 타입이 다르면 연산 불가능

- 텐서 차원은 신경망에서 자주 다룸

- 가장 대표적인 차원 변경 방법은 view 사용(넘파이의 reshape와 유사)

- 텐서 결합하는 stack, cat(다른 길이 텐서를 하나로 병합할 때)

- 차원 교환하는 t, transpose(행렬의 전치 외 차원 순서 변경에도 사용됨) 사용

temp =torch.tensor([[1,2],[3,4]]) # 2x2 행렬 생성
temp.view(4,1) # 4x1 행렬로 변형
temp.view(-1) # 1차원 벡터로 변형

# -1은 (1,?)의 다른 차원으로부터 해당 값을 유추하겠다는 뜻

temp.view(1,-1) # 1x4 행렬로 변형
temp.view(-1,1) # 4x1 행렬로 변형

 

데이터

데이터가 이미지인 경우 분산된 파일에서 데이터를 읽고 전처리 한 후, 배치 단위로 분할해서 처리

데이터가 텍스트인 경우 임베딩 과정 거쳐 다른 길이의 시퀀스를 배치 단위로 분할하여 처리함

 

단순하게 파일 불러와서 사용

- json, csv

data = pd.read_csv(path)
# CSV 파일의 x 컬럼을 넘파이로 받아서 tensor로 바꿔줌
x=torch.from_numpy(data['x'].values).unsqueeze(dim=1).float()

 

커스텀 데이터

데이터를 조금씩 나누어 불러서 사용하는 방식

CustomDataset 클래스

class CustomDataset(torchutils.data.Dataset):
# 필요한 변수 선언, 데이터셋 전처리
	def __init__(self): 
# 데이터셋의 길이, 샘플 수를 가져옴
    def __len__(self):
# 데이터셋에서 특정 데이터를 가져옴. index번째 데이터를 반환. 반환되는 값은 텐서의 형태를 취함
    def __getitem__(self, index):
import pandas as pd
import torch
from torch.utils.data import Dataset
from torch.utils.data import DataLoader

class CustomDataset(torchutils.data.Dataset):
	def __init__(self, csv_file): 
    	self.label = pd.read_csv(csv_file)
        
    def __len__(self):
    	return len(self.label)
        
    def __getitem__(self, idx):
    	sample = torch.tensor(self.label.iloc[idx,0:3]).int()
        label = torch.tensor(self.label.iloc[idx,3]).int()
        return sample, label

tensor_dataset=CustomDataset('../data.csv')
dataset=DataLoader(tensor_Dataset, batch_size=4, shuffle=True)
# 데이터셋을 DataLoader에 파라미터로 전달

DataLoader

학습에 사용될 데이터 전체를 보관했다가 모델 학습 시 배치 크기만큼 데이터를 꺼내서 사용

데이터를 미리 잘라 두는 것이 나니, 내부적으로 반복자(iterator)에 포함된 인덱스 이용해서 배치 크기만큼 데이터를 반환함

-> for문을 이용해서 구문을 반복 실행하는 것

 

파이토치에서 제공하는 데이터셋 사용

- 토치비전 : 파이토치에서 제공하는 데이터셋이 모있는 패키지

- requests 라이브러리를 설치해서 HTTP 요청에 대한 처리 해야함

 

import torchvision.transforms as transforms

mnist_transform =transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.5,),(1.0,))])
# 평균이 0.5, 표준편차가 1.0이 되도록 데이터 분포 조정

from torchvision.datasets import MNIST
import requests
download_root= path

train_dataset=MNIST(download_root, transform=mnist_transform, train=True, download=True)
valid_dataset=MNIST(download_root, transform=mnist_transform, train=False, download=True)
test_dataset=MNIST(download_root, transform=mnist_transform, train=False, download=True)

'Pytorch' 카테고리의 다른 글

torch.nn과 torch.nn.functional  (0) 2023.09.11
ResNet Image Feature Extraction  (0) 2023.09.04
파이토치 모델 정의  (0) 2022.04.30
파이토치 기초  (0) 2022.04.27
머신러닝과 딥러닝  (0) 2022.04.26