본문 바로가기

Programming/Data mining

Pytorch 01. 파이토치 시작하기.

이 포스팅은 순수 개인 연구 목적으로 처음 딥러닝을 사용하며 정리용으로 작성되었습니다.

1. Pytorch 설치

#ANACONDA
conda install pytorch torchvision -c pytorch

#PIP
pip3 install torch torchvision

 

2. 텐서(Tensor)
numpy의 ndarray와 같은 자료구조라고 생각하면 됨.
이는 자동미분에 최적화되어있음.

#array data 바로 tensor화
data = [[1, 2],[3, 4]]
x_data = torch.tensor(data)

#numpy의 tensor화
#이 때 서로의 값을 참조하고 있기 때문에 변경사항이 서로 반영됨
np_array = np.array(data)
x_tensor = torch.from_numpy(np_array)
x_np = x_tensor.numpy()


#2차원 배열 인덱싱
tensor[0]			#row indexing
tensor[:,0]			#column indexing

#concat (dim=0: 세로로 concat, dim=1: 가로로 concat)
torch.cat([tensor, tensor, tensor], dim=1)

#곱하기 연산
#행렬간 연산
tensor @ tensor.T
tensor.matmul(tensor.T)
y3 = torch.rand_like(tensor)
torch.matmul(tensor, tensor.T, out=y3)

#행렬 요소 곱
z1 = tensor * tensor
z2 = tensor.mul(tensor)
z3 = torch.rand_like(tensor)
torch.mul(tensor, tensor, out=z3)

#단일요소의 tensor의 경우 item()메소드 활용, indexing하면 에러남.
agg = tensor.sum()
agg_item = agg.item()

#연산 뒤에 접미사로 _를 붙이면 inplace
tensor.add_(5)

 

3. DataSet과 DataLoader

#Dataset

#예제
class CustomImageDataset(Dataset):
    def __init__(self, annotations_file, img_dir, transform=None, target_transform=None):
        self.img_labels = pd.read_csv(annotations_file)
        self.img_dir = img_dir
        self.transform = transform
        self.target_transform = target_transform

    def __len__(self): #샘플 개수반환
        return len(self.img_labels)

    def __getitem__(self, idx): #샘플 반환(이미지와 라벨 dict형태로반환)
        img_path = os.path.join(self.img_dir, self.img_labels.iloc[idx, 0])
        image = read_image(img_path)
        label = self.img_labels.iloc[idx, 1]
        if self.transform:
            image = self.transform(image)
        if self.target_transform:
            label = self.target_transform(label)
        return image, label
        
        
#DataLoader
#Dataset 샘플에 쉽게 접근할 수 있게 iterable할 객체로 감싸줌.
#이 때 배치사이즈 및 shuffle할 수 있음

#예제
from torch.utils.data import DataLoader

train_dataloader = DataLoader(training_data, batch_size=64, shuffle=True)
test_dataloader = DataLoader(test_data, batch_size=64, shuffle=True)

train_features, train_labels = next(iter(train_dataloader))
print(f"Feature batch shape: {train_features.size()}")
print(f"Labels batch shape: {train_labels.size()}")
img = train_features[0].squeeze()
label = train_labels[0]
print(f"Label: {label}")

>>
Feature batch shape: torch.Size([64, 1, 28, 28])
Labels batch shape: torch.Size([64])
Label: 2

 

4. Transform

#transform, target_transform 매개변수를 통해 학습에 적합한 데이터로 조작가능
#ToTensor -> normalize
#Lambda -> onehot encoding

#예제
import torch
from torchvision import datasets
from torchvision.transforms import ToTensor, Lambda

ds = datasets.FashionMNIST(
    root="data",
    train=True,
    download=True,
    transform=ToTensor(),
    target_transform=Lambda(lambda y: torch.zeros(10, dtype=torch.float).scatter_(0, torch.tensor(y), value=1))
)