import pandas as pd
import torch
from PIL import Image
from torch.utils.data import Dataset, DataLoader
class ProductImageDataset(Dataset):
def __init__(self, metadata_path, image_root, transform=None):
self.df = pd.read_csv(metadata_path)
self.image_root = image_root
self.transform = transform
def __len__(self):
return len(self.df)
def __getitem__(self, index):
row = self.df.iloc[index]
image = Image.open(f"{self.image_root}/{row['image_name']}").convert('RGB')
if self.transform:
image = self.transform(image)
label = torch.tensor(row['label'], dtype=torch.long)
return image, label
train_loader = DataLoader(dataset=train_dataset, batch_size=64, shuffle=True, num_workers=4, pin_memory=True)
Input pipelines are part of the model system, not an afterthought. I keep dataset classes deterministic, move expensive transforms into explicit stages, and use DataLoader settings that match hardware limits. Good batching and collation logic can remove a surprising amount of GPU idle time.