텐서 생성 및 변환
- 넘파이의 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 |