Dataset

박영욱·2023년 6월 29일

데이터 세트

데이터셋? 이거 매우 중요해 정말정말!
데이터들의 집합체 즉, 자료들의 모임이다. 특정한 작업을 위해서 데이터를 관령성 있게 모아놓은 것을 말한며 데이가 얼마나 중요하냐면, 실제 인공지능 프로젝트의 80%는 데이터를 수집하고 정제하고 라벨링하는 작업일정도로 중요하다!!

데이터의 중요성

Quality+Quantity
질(quality) : 데이터가 얼마나 모델(종속변수 Y)을 잘 설명할 수 있는지 보아야 한다.
양(quantity) : 선정한 데이터들이 모델을 잘 설명한다고 하여도 데이터가 충분하지 않다면 현실을 반영하지 못할 것이다.
즉, 의도하는 목적에 맞아야 하며(Quality), 현실을 잘 반영해야한다(Quantity)

5W1H

What?
측정대상
획득 시 포함되어야 할 변수들
: 일반인이 대상을 식별할 수 있는 피사체
: 장비,사람,시간,종류,객체,지역별 검토

When?
획득기간
: N주간 몇 시부터 몇시까지 몇 회

where?
획득 장소/프로세스

Who?
획득 담당자/획득하는 사람
: 연구 담당자

How?
획득 방법, 측정주기, 샘플 크기
데이터 양식

Why?
측정 목적 / 기대결과
: 목적에 맞는 힉득 데이터 이해와 프로세스 능력의 파악/추세분석

Data 불러오기 ex)

파이토치 제공 데이터

import torch # 파이토치 기본 라이브러리
import torchvision # 이미지 관련 된 파이토치 라이브러리
import torchvision.transforms as tr # 이미지 전처리 기능들을 제공하는 라이브러리
from torch.utils.data import DataLoader, Dataset # 데이터를 모델에 사용할 수 있도록 정리해 주는 라이브러리
import numpy as np # 넘파이 기본 라이브러리

transf = tr.Compose([tr.Resize(16),tr.ToTensor()]) # 16x16으로 이미지 크기 변환 후 텐서 타입으로 변환한다.

trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transf)
testset = torchvision.datasets.CIFAR10(root='./data', train=False, download=True, transform=transf)

print(trainset[0][0].size())

trainloader = DataLoader(trainset, batch_size=50, shuffle=True)
testloader = DataLoader(testset, batch_size=50, shuffle=False)

len(trainloader)

dataiter = iter(trainloader)
images, labels = next(dataiter)

print(images.size())

같은 클래스 별로 폴더 정리

from google.colab import drive
drive.mount('/content/gdrive')

cd/content/gdrive/My Drive/

transf = tr.Compose([tr.Resize((128, 128)),tr.ToTensor()]) # 128x128 이미지 크기 변환 후 텐서로 만든다.
trainset = torchvision.datasets.ImageFolder(root='./class', transform=transf) # 커스텀 데이터 불러온다.
trainloader = DataLoader(trainset, batch_size=2, shuffle=False) # 데이터를 미니 배치 형태로 만들어 준다.

dataiter = iter(trainloader)

images, labels = next(dataiter)

print(images.size(), labels)

정형화 되지 않은 커스텀 데이터 불러오기

#32x32 컬러 이미지와 라벨이 각각 100장이 있다고 가정하다.

train_images = np.random.randint(256,size=(100,32,32,3)) # (이미지 수)x(높이)x(너비)x(채널 수)
train_labels = np.random.randint(2,size=(100,1)) # 라벨 수

print(train_images.shape, train_labels.shape)

class TensorData(Dataset):

def __init__(self, x_data, y_data): #데이터 불러오기/기본 값
    self.x_data = torch.FloatTensor(x_data) # 이미지 데이터를 FloatTensor로 변형
    self.x_data = self.x_data.permute(0,3,1,2) # (이미지 수)x(높이)x(너비)x(채널 수) -> (이미지 수)x(채널 수)x(높이)x(너비)
    self.y_data = torch.LongTensor(y_data) # 라벨 데이터를 LongTensor로 변형
    self.len = self.y_data.shape[0] # 클래스 내의 들어 온 데이터 개수 

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) # 미니 배치 형태로 데이터 갖추기

커스텀 데이터와 전처리

import torch
import torchvision.transforms as tr # 이미지 전처리 기능들을 제공하는 라이브러리
from torch.utils.data import DataLoader, Dataset # 데이터를 모델에 사용할 수 있도록 정리해 주는 라이브러리
import numpy as np # 넘파이 기본 라이브러리

#32x32 컬러 이미지와 라벨이 각각 100장이 있다고 가정하다.
#glob -> PIL, openCV ..
train_images = np.random.randint(256,size=(100,32,32,3)) # (이미지 수)x(높이)x(너비)x(채널 수)
train_labels = np.random.randint(2,size=(100,1)) # 라벨 수

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.transform(sample) #self.transform이 None이 아니라면 전처리를 작업한다.
    
    return sample # 3.3과 다르게 넘파이 배열로 출력 되는 것에 유의 하도록 한다.

def __len__(self):
    return self.len      
  1. 텐서 변환
    class ToTensor:
    def call(self, sample):
    inputs, labels = sample
    inputs = torch.FloatTensor(inputs) # 텐서로 변환
    inputs = inputs.permute(2,0,1) # 크기 변환
    return inputs, torch.LongTensor(labels) # 텐서로 변환

  2. 선형식
    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 # ax+b 계산하기
        return inputs, labels         

trans = tr.Compose([ToTensor(),LinearTensor(2,5)]) # 텐서 변환 후 선형식 2x+5 연산
dataset1 = MyDataset(train_images,train_labels, transform=trans)
train_loader1 = DataLoader(dataset1, batch_size=10, shuffle=True)

dataiter1 = iter(train_loader1)
images1, labels1 = next(dataiter1)
print(images1.size()) # 배치 및 이미지 크기 확인

커스텀 데이터와 torchvision.transforms 전처리

class MyTransform:

def __call__(self, sample):
    inputs, labels = sample
    inputs = torch.FloatTensor(inputs)
    inputs = inputs.permute(2,0,1)
    labels = torch.FloatTensor(labels)

    transf = tr.Compose([tr.ToPILImage(), tr.Resize(128),tr.ToTensor(),tr.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])
    final_output = transf(inputs)      
    
    return final_output, labels 

dataset2 = MyDataset(train_images,train_labels, transform=MyTransform())
train_loader2 = DataLoader(dataset2, batch_size=15, shuffle=True)

dataiter2 = iter(train_loader2)
images2, labels2 = next(dataiter2)
print(images2.size()) # 배치 및 이미지 크기 확인

FashionMNIST 예제

import numpy as np
import matplotlib.pyplot as plt

import torch
import torch.nn as nn
from torch.autograd import Variable
import torch.nn.functional as F

import torchvision
import torchvision.transforms as transforms
from torch.utils.data import Dataset, DataLoader

device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")

train_dataset = torchvision.datasets.FashionMNIST("FashionMNIST/", download=True, transform=
transforms.Compose([transforms.ToTensor()]))
test_dataset = torchvision.datasets.FashionMNIST("FashionMNIST/", download=True, train=False, transform=
transforms.Compose([transforms.ToTensor()]))

train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=100)
test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=100)

labels_map = {0 : 'T-Shirt', 1 : 'Trouser', 2 : 'Pullover', 3 : 'Dress', 4 : 'Coat', 5 : 'Sandal', 6 : 'Shirt',
7 : 'Sneaker', 8 : 'Bag', 9 : 'Ankle Boot'}

fig = plt.figure(figsize=(8,8));
columns = 4;
rows = 5;
for i in range(1, columns*rows +1):
img_xy = np.random.randint(len(train_dataset));
img = train_dataset[img_xy][0][0,:,:]
fig.add_subplot(rows, columns, i)
plt.title(labels_map[train_dataset[img_xy][1]])
plt.axis('off')
plt.imshow(img, cmap='gray')
plt.show()

RandomResizedCrop 예제

!pip install mxnet

import matplotlib.pyplot as plt
import mxnet as mx
from mxnet.gluon.data.vision import transforms

from google.colab import files # 데이터 불러오기
file_uploaded=files.upload() # chap05/data/cat.jpg 데이터 불러오기

example_image = mx.image.imread("cat.jpg")
plt.imshow(example_image.asnumpy())

def showimages(imgs, num_rows, num_cols, scale=2):
aspect_ratio = imgs[0].shape[0]/imgs[0].shape[1]
figsize = (num_cols scale, num_rows scale * aspect_ratio)
, axes = plt.subplots(num_rows, num_cols, figsize=figsize)
for i in range(num_rows):
for j in range(num_cols):
axes[i][j].imshow(imgs[i * num_cols + j].asnumpy())
axes[i][j].axes.get_xaxis().set_visible(False)
axes[i][j].axes.get_yaxis().set_visible(False)
plt.subplots_adjust(hspace=0.1, wspace=0)
return axes

def apply(img, aug, numrows=2, num_cols=4, scale=3):
Y = [aug(img) for
in range(num_rows * num_cols)]
show_images(Y, num_rows, num_cols, scale)

shape_aug = transforms.RandomResizedCrop(size=(200, 200),
scale=(0.1, 1),
ratio=(0.5, 2))
apply(example_image, shape_aug)

profile
Medical AI

0개의 댓글