[IBM course #4] Introduction to Neural Networks and PyTorch
Simple Dataset
Dataset 클래스
torch.utils.data.Dataset은 PyTorch에서 데이터셋을 커스터마이징할 수 있도록 제공하는 추상 클래스(Abstract Class)
주로 __init__, __len__, __getitem__ 메서드를 구현해서 나만의 데이터셋을 만들 수 있음
- __init__ : 초기화 메서드. 파일 경로, 라벨, 전처리 등을 저장하고 준비
- __len__ : 데이터셋의 총 길이 반환. len(dataset) 호출 시 몇 개의 샘플이 있는지 알려줌
- __getitem__ : 주어진 index에 해당하는 데이터 샘플 하나를 반환. dataset[i] 호출 시 i번째 샘플과 라벨을 반환. 반환값은 (x[i], y[i]) 튜플 형태.
iterable
데이터셋 객체는 iterable로 for 루프로 순회 가능.
루프 시 __getitem__이 자동 호출되어 첫 3개 샘플을 추출 가능.
Transform 클래스
Transform 클래스는 PyTorch에서 데이터 전처리(preprocessing)를 손쉽게 적용할 수 있게 해주는 모듈형 도구
__call__() 메서드를 구현하여, 일반 함수처럼 사용할 수 있음
Dataset 클래스에서 transform 사용
class MyDataset(Dataset):
def __init__(self, data, labels, transform=None):
self.data = data
self.labels = labels
self.transform = transform
def __getitem__(self, idx):
x = self.data[idx]
y = self.labels[idx]
if self.transform:
x = self.transform(x) # 여기서 적용!
return x, y
dataset = MyDataset(transform=my_transform)
Compose
torchvision.transforms.Compose는 PyTorch에서 여러 개의 변환(transform)을 순서대로 적용할 수 있도록 해주는 도구(Wrapper 클래스)
여러 개의 transform을 리스트로 묶어, 순차적으로 적용하는 기능을 하며, 각 transform은 __call__()을 구현한 객체 또는 함수여야 함.
transform = transforms.Compose([Add(), Multiply()])
Datasets for Images
CSV 파일 활용
Pandas read_csv()로 레이블과 이미지 경로 불러오기.
각 행은 [클래스(의류 종류), 이미지 파일명]으로 구성.
개별 이미지 접근
이미지 경로 조합 후 Image.open()으로 불러오기.
라벨과 함께 이미지 출력 가능.
Dataset 클래스 작성
모든 이미지를 메모리에 로드하지 않음. 필요할 때마다 불러오는 방식(lazy loading) 사용 → 대규모 데이터에 적합.
__getitem__()에서 경로 통해 이미지 로드, 레이블 추출, (image, label) 튜플 반환 등을 진행
TorchVision Transform
transforms.CenterCrop (이미지 자르기)
transforms.ToTensor (이미지를 텐서로 변환)
→ Compose로 여러 변환을 조합 적용 가능
샘플 코드
csv 파일이 아래와 같은 구조일 때
label,filename
3,img_00001.png
7,img_00002.png
...
import torch
from torch.utils.data import Dataset
from torchvision import transforms
from PIL import Image
import pandas as pd
import os
class Dataset(Dataset):
def __init__(self, csv_file, image_dir, transform=None):
self.data = pd.read_csv(csv_file) # CSV 파일 로드
self.image_dir = image_dir # 이미지 폴더 경로
self.transform = transform # 변환 함수 (Compose 등)
def __len__(self):
return len(self.data)
def __getitem__(self, idx):
row = self.data.iloc[idx]
img_path = os.path.join(self.image_dir, row['filename'])
image = Image.open(img_path).convert('L') # grayscale
label = int(row['label'])
if self.transform:
image = self.transform(image)
return image, label
transform = transforms.Compose([
transforms.CenterCrop(24),
transforms.ToTensor()
])
dataset = Dataset(
csv_file='data.csv',
image_dir='images',
transform=transform
)
loader = torch.utils.data.DataLoader(dataset, batch_size=32, shuffle=True)
for images, labels in loader:
print(images.shape) # torch.Size([32, 1, 24, 24])
print(labels)
break
(참고) TorchVision 내장 Dataset
torchvision.datasets.MNIST 사용
root, train, download, transform 파라미터 사용
이미 다운로드된 경우 재다운로드하지 않음
'🥇 certification logbook' 카테고리의 다른 글
[Coursera/IBM course #4] Linear Regression Prediction (0) | 2025.06.14 |
---|---|
[Coursera/IBM course #4] Tensors (2) | 2025.06.07 |
[Coursera/IBM course #3] 강화학습(Reinforcement Learning) (2) | 2025.06.04 |
[Coursera/IBM course #3] Advanced Keras Techniques (2) | 2025.06.01 |
[Coursera/IBM course #3] Unsupervised Learning in Keras (2) | 2025.05.31 |
[Coursera/IBM course #3] Transformers in Keras (2) | 2025.05.28 |
[Coursera/IBM course #3] TensorFlow for Image Processing (1) | 2025.05.24 |
[Coursera/IBM course #3] TensorFlow 2.x (1) | 2025.05.21 |