Source code for kaira.data.sample_data

"""Simple image dataset utilities for Kaira.

This module provides basic image dataset functionality for testing and examples.
"""

from typing import Optional, Tuple

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


[docs] class ImageDataset(Dataset): """Simple wrapper for common image datasets. Provides easy access to CIFAR-10, CIFAR-100, and MNIST datasets with consistent interface and optional preprocessing. """
[docs] def __init__( self, name: str = "cifar10", train: bool = True, size: Optional[Tuple[int, int]] = None, normalize: bool = True, root: str = "~/.cache/kaira", ): """Initialize the image dataset. Args: name: Dataset name ("cifar10", "cifar100", "mnist") train: Whether to use training split size: Target image size (H, W). If None, uses original size normalize: Whether to normalize images to [0, 1] root: Root directory for dataset storage """ self.name = name.lower() # Build transforms transform_list = [] if size is not None: transform_list.append(transforms.Resize(size)) transform_list.append(transforms.ToTensor()) if not normalize: # Convert back to [0, 255] range if normalization is disabled transform_list.append(transforms.Lambda(lambda x: x * 255)) transform = transforms.Compose(transform_list) # Load dataset if self.name == "cifar10": self.dataset = torchvision.datasets.CIFAR10(root=root, train=train, download=True, transform=transform) elif self.name == "cifar100": self.dataset = torchvision.datasets.CIFAR100(root=root, train=train, download=True, transform=transform) elif self.name == "mnist": self.dataset = torchvision.datasets.MNIST(root=root, train=train, download=True, transform=transform) else: raise ValueError(f"Unsupported dataset: {self.name}")
def __len__(self) -> int: """Return the size of the dataset.""" return len(self.dataset) def __getitem__(self, idx: int) -> Tuple[torch.Tensor, int]: """Get a sample from the dataset. Args: idx: Index of the sample Returns: Tuple of (image, label) """ return self.dataset[idx]
[docs] def subset(self, size: int, seed: Optional[int] = None) -> "Subset": """Create a random subset of the dataset. Args: size: Number of samples in the subset seed: Random seed for reproducibility Returns: Subset of the dataset """ if seed is not None: torch.manual_seed(seed) indices = torch.randperm(len(self))[:size] return Subset(self, indices)
__all__ = ["ImageDataset"]