
https://www.youtube.com/watch?v=8PnxJ3s3Cwo
| # 라이브러리 불러오기 
 import torch import torchvision import torchvision.transforms as tr from torch.utils.data import DataLoader, Dataset import numpy as np | 
1. 파이토치 제공 데이터 사용
| # 데이터 전처리 transf = tr.Compose([tr.Resize(8),tr.ToTensor()]) | |
| # 파이토치에서 제공하는 데이터 불러오기 trainset = torchvision.datasets.CIFAR10(root='C:/pypy', train=True, download=True, transform=transf) testset = torchvision.datasets.CIFAR10(root='C:/pypy', train=False, download=True, transform=transf) |  | 
| # train 데이터셋의 사이즈 확인 
 trainset[0][0].size() |  | 
| # 배치 형태로 변환 
 trainloader = DataLoader(trainset, batch_size=50, shuffle=True, num_workers=2) testloader = DataLoader(testset, batch_size=50, shuffle=True, num_workers=2) | |
| # 데이터 길이 학인 
 len(trainloader) |  | 
| # trainloader안의 실제값 확인 dataiter = iter(trainloader) images, labels = dataiter.next() images.size() |  | 
2. 같은 클래스 별 폴더 이미지 데이터 이용
| # 이미지가 클래스별로 폴더에 분류되었을 경우 
 transf = tr.Compose([tr.Resize(16), tr.ToTensor()]) trainset = torchvision.datasets.ImageFolder(root="C:/class", transform=transf) trainloader = DataLoader(trainset, batch_size=1, shuffle=False, num_workers=2) print(len(trainloader)) |  | 
| # train 데이터셋의 사이즈 확인 trainset[0][0].size() |  | 
3. 개인 데이터 사용 (2 types)
| # import preprocession 
 train_images = np.random.randint(256, size=(20,32,32,3)) train_labels = np.random.randint(2, size=(20,1)) print(train_images.shape, train_labels.shape) |  | 
| # Dataset을 상속받을 클래스 만들기 (TensorData) 
 class TensorData(Dataset): def __init__(self, x_data, y_data): self.x_data = torch.FloatTensor(x_data) # 들어온 데이터의 형식 바꾸기 self.x_data = self.x_data.permute(0,3,1,2) # 이미지 개수, 채널 수, 이미지 너비, 높이 self.y_data = torch.LongTensor(y_data) self.len = self.y_data.shape[0] 
 # x,y를 튜플형태로 바깥으로 내보내기 def __getitem__(self, index): return self.x_data[index], self.y_data[index] 
 def __len__(self): return self.len | |
| # 인스터스 생성 train_data = TensorData(train_images, train_labels) train_loader = DataLoader(train_data, batch_size=10, shuffle=True) | |
| # 데이터 사이즈 확인 train_data[0][0].size() |  | 
| # train_loader안의 실제값 확인 
 dataiter = iter(train_loader) images, labels = dataiter.next() images.size() |  | 
| torchvision.datasets.ImageFolder를 쓰지 않는 이유
 | |
4. 파이토치로 무조건 전처리하기 (고급)
| 아래 양식 기억하자!! from torch.utils.data import Dataset 
 class MyDataset(Dataset): 
 def __init__(self): 
 def __getitem__(self, index): 
 def __len__(self): | |
| # 개인 데이터에 transform 까지 사용 
 class MyDataset(Dataset): def __init__(self, x_data, y_data, transform=None): # 텐서 변환 안함 self.x_data = x_data self.y_data = y_data self.transform = transform self.len = len(y_data) 
 def __getitem__(self, index): # 튜플 형태로 내보내기 전에 전처리 작업 실행 sample = self.x_data[index], self.y_data[index] 
 if self.transform: sample = self.trasform(sample) 
 return sample # 넘파이로 출력됨 
 def __len__(self): return self.len 
 
 class ToTensor: def __call__(self, sample): inputs, labels = sample inputs = torch.FloatTensor(inputs) inputs = inputs.permute(2,0,1) return inputs, torch.LongTensor(labels) 
 # 들어온 데이터를 연산 class LinearTensor: def __init__(self, slope=1, bias=0): self.slope = slope self.bias = bias 
 def __call__(self, sample): inputs, labels = sample inputs = self.slope * inputs + self.bias return inputs, labels | |
| # 인스턴스 생성 및 데이터 처리 
 trans = tr.Compose([ToTensor(),LinearTensor(2,5)]) ds1 = MyDataset(train_images, train_labels, transform=trans) train_loader1 = DataLoader(ds1, batch_size=10, shuffle=True) | |
| # 데이터 확인 
 first_data = ds1[0] features, labels = first_data print(type(features), type(labels)) | |
'인공지능 > 파이토치' 카테고리의 다른 글
| 파이토치 무작정 시작하기 6 - 모델 변수 프리징 (0) | 2020.07.17 | 
|---|---|
| 파이토치 무작정 시작하기 5 - GPU를 사용한 전이 학습 (colab 사용) (0) | 2020.07.16 | 
| 파이토치 무작정 시작하기 4 - CNN 기본 모델 구축 (0) | 2020.07.16 | 
| 파이토치 무작정 시작하기 2 - 패키지 구성 / 자동 미분 계산 (0) | 2020.07.09 | 
| 파이토치 무작정 시작하기 1 - 파이토치 / 텐서 (0) | 2020.07.07 |