We use a Custom Dataset class to organize and prepare data for machine learning models in PyTorch. It helps load data easily and cleanly.
Custom Dataset class in PyTorch
from torch.utils.data import Dataset class CustomDataset(Dataset): def __init__(self, data, labels): self.data = data self.labels = labels def __len__(self): return len(self.data) def __getitem__(self, idx): sample = self.data[idx] label = self.labels[idx] return sample, label
The __init__ method sets up your data.
The __len__ method returns how many samples you have.
The __getitem__ method gets one sample and its label by index.
class MyDataset(Dataset): def __init__(self, data): self.data = data def __len__(self): return len(self.data) def __getitem__(self, idx): return self.data[idx]
from torchvision.io import read_image class ImageDataset(Dataset): def __init__(self, image_paths, labels, transform=None): self.image_paths = image_paths self.labels = labels self.transform = transform def __len__(self): return len(self.image_paths) def __getitem__(self, idx): image = read_image(self.image_paths[idx]) if self.transform: image = self.transform(image) label = self.labels[idx] return image, label
This program creates a simple dataset with features and labels, then uses DataLoader to get batches of size 2. It prints each batch's data and labels.
import torch from torch.utils.data import Dataset, DataLoader class SimpleDataset(Dataset): def __init__(self, data, labels): self.data = data self.labels = labels def __len__(self): return len(self.data) def __getitem__(self, idx): return self.data[idx], self.labels[idx] # Sample data features = torch.tensor([[1, 2], [3, 4], [5, 6], [7, 8]]) labels = torch.tensor([0, 1, 0, 1]) # Create dataset dataset = SimpleDataset(features, labels) # Use DataLoader to get batches loader = DataLoader(dataset, batch_size=2, shuffle=True) for batch_data, batch_labels in loader: print('Batch data:', batch_data) print('Batch labels:', batch_labels) print('---')
Always return data and label as tensors in __getitem__ for PyTorch models.
You can add data transformations inside __getitem__ if needed.
Using DataLoader with your custom dataset helps with batching and shuffling automatically.
A Custom Dataset class organizes your data for PyTorch models.
Implement __init__, __len__, and __getitem__ methods.
Use DataLoader with your dataset to handle batches and shuffling easily.
Practice
Solution
Step 1: Understand Dataset role
A Custom Dataset class is designed to organize data and provide easy access to samples during training.Step 2: Differentiate from other components
Neural network architecture and optimization are handled elsewhere, not by the Dataset class.Final Answer:
To organize and provide access to data samples for model training -> Option BQuick Check:
Dataset class = data access [OK]
- Confusing Dataset with model definition
- Thinking Dataset handles optimization
- Assuming Dataset visualizes data
Solution
Step 1: Recall Dataset methods
__len__ returns the total number of samples in the dataset.Step 2: Identify other methods' roles
__getitem__ fetches a sample, __init__ initializes the dataset, forward is for models, not datasets.Final Answer:
__len__ -> Option CQuick Check:
Count samples = __len__ [OK]
- Using __getitem__ to get length
- Confusing __init__ with length method
- Using forward method in Dataset
print(len(dataset)) output?import torch
from torch.utils.data import Dataset
class MyDataset(Dataset):
def __init__(self):
self.data = [10, 20, 30, 40]
def __len__(self):
return len(self.data)
def __getitem__(self, idx):
return self.data[idx]
dataset = MyDataset()Solution
Step 1: Check __len__ method
__len__ returns length of self.data, which is a list of 4 elements.Step 2: Evaluate print output
Calling len(dataset) calls __len__, so output is 4.Final Answer:
4 -> Option AQuick Check:
len([10,20,30,40]) = 4 [OK]
- Confusing length with last element value
- Expecting __getitem__ output instead of length
- Assuming error without checking code
from torch.utils.data import Dataset
class SampleDataset(Dataset):
def __init__(self, data):
self.data = data
def __len__(self):
return self.data
def __getitem__(self, idx):
return self.data[idx]
sample = SampleDataset([1,2,3])
print(len(sample))Solution
Step 1: Analyze __len__ method
__len__ returns self.data, which is a list, not an integer length.Step 2: Understand len() requirement
len() expects __len__ to return an integer. Returning a list causes a TypeError.Final Answer:
__len__ returns data list instead of its length -> Option DQuick Check:
__len__ must return int, not list [OK]
- Returning data list instead of length in __len__
- Ignoring import statements
- Confusing __getitem__ with __len__
Solution
Step 1: Check __init__ and __len__ consistency
The correct implementation stores inputs and labels separately and returns length of inputs in __len__, assuming matching lengths with labels.Step 2: Verify __getitem__ returns both features and labels
The correct __getitem__ returns a tuple (self.inputs[idx], self.labels[idx]) for supervised learning.Final Answer:
return self.inputs[idx], self.labels[idx] -> Option AQuick Check:
Return (input, label) tuple in __getitem__ [OK]
- Combining inputs and labels into one list
- Returning only inputs or only labels
- Mismatched lengths in __len__
Ready to prove it?
Pass the test and this pattern moves unknown
