Image dataset from folders in PyTorch - ML Experiment: Train & Evaluate
import torch from torchvision import datasets, transforms from torch.utils.data import DataLoader # Define image transformations including resize, augmentation, and normalization transform = transforms.Compose([ transforms.Resize((128, 128)), transforms.RandomHorizontalFlip(), transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) ]) # Load dataset from folders using ImageFolder train_dataset = datasets.ImageFolder(root='data/train', transform=transform) val_dataset = datasets.ImageFolder(root='data/val', transform=transform) # Create DataLoader for batching and shuffling train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True, num_workers=4) val_loader = DataLoader(val_dataset, batch_size=32, shuffle=False, num_workers=4) # Example: Iterate over one batch for images, labels in train_loader: print(f'Batch images shape: {images.shape}') print(f'Batch labels shape: {labels.shape}') break # Model training code would use train_loader and val_loader for improved performance
Before: Training accuracy 60%, Validation accuracy 55%, Losses around 1.2-1.3.
After: Training accuracy 82%, Validation accuracy 78%, Losses reduced to 0.6-0.7.
Practice
What does torchvision.datasets.ImageFolder do when loading images?
Solution
Step 1: Understand ImageFolder functionality
ImageFolder expects a root directory with subfolders. Each subfolder name is treated as a class label.Step 2: Confirm label assignment
Images inside each subfolder are assigned the label of that folder automatically.Final Answer:
Loads images from folders where each folder name is used as a class label -> Option DQuick Check:
ImageFolder uses folder names as labels [OK]
- Thinking ImageFolder loads images without labels
- Assuming ImageFolder splits data automatically
- Believing ImageFolder converts images to grayscale by default
Which of the following is the correct way to apply a transform that resizes images to 64x64 and converts them to tensors when using ImageFolder?
transform = transforms.Compose([
?
])
dataset = ImageFolder(root='data/train', transform=transform)Solution
Step 1: Identify correct transform order
Resize must come before ToTensor because ToTensor expects a PIL image or ndarray.Step 2: Check syntax correctness
transforms.Resize takes a tuple for width and height. transforms.ToTensor converts PIL image to tensor.Final Answer:
transforms.Resize((64, 64)), transforms.ToTensor() -> Option AQuick Check:
Resize then ToTensor is correct order [OK]
- Applying ToTensor before Resize
- Using Resize with a single integer without tuple
- Using ToPILImage instead of ToTensor
Given the following code, what will len(dataloader) print if the dataset has 100 images and batch_size=20?
from torchvision.datasets import ImageFolder
from torch.utils.data import DataLoader
from torchvision import transforms
transform = transforms.Compose([
transforms.Resize((32, 32)),
transforms.ToTensor()
])
dataset = ImageFolder(root='data/train', transform=transform)
dataloader = DataLoader(dataset, batch_size=20, shuffle=True)
print(len(dataloader))Solution
Step 1: Calculate number of batches
Dataset size is 100 images, batch size is 20, so number of batches = 100 / 20 = 5.Step 2: Confirm DataLoader length meaning
len(dataloader) returns number of batches per epoch, which is 5 here.Final Answer:
5 -> Option AQuick Check:
100 images / 20 batch size = 5 batches [OK]
- Confusing batch size with number of batches
- Assuming shuffle changes batch count
- Thinking len(dataloader) returns total images
What is wrong with this code snippet for loading an image dataset?
from torchvision.datasets import ImageFolder
from torchvision import transforms
dataset = ImageFolder(root='data/train', transform=transforms.ToTensor())Solution
Step 1: Check ImageFolder transform usage
ImageFolder passes PIL images to the transform function, so transforms.ToTensor() works fine alone.Step 2: Confirm no syntax or logic error
Using only ToTensor is valid; resizing is optional but not required.Final Answer:
No error; this code works correctly -> Option CQuick Check:
ImageFolder passes PIL images, ToTensor alone is valid [OK]
- Thinking ToTensor needs Resize always
- Believing ImageFolder needs image paths list
- Assuming ToTensor cannot handle PIL images
You want to load images from folders and apply a transform that randomly flips images horizontally during training but not during validation. How can you set up ImageFolder and transforms for this?
Solution
Step 1: Understand data augmentation purpose
RandomHorizontalFlip is a data augmentation used only during training to improve generalization.Step 2: Apply transforms separately for train and validation
Training transform includes RandomHorizontalFlip; validation transform excludes it to keep data consistent.Final Answer:
Use transforms.RandomHorizontalFlip() in training transform only, and a separate transform without flip for validation -> Option BQuick Check:
Augment training only, keep validation unchanged [OK]
- Applying random flip in validation data
- Not separating train and validation transforms
- Placing RandomHorizontalFlip outside Compose
Ready to prove it?
Pass the test and this pattern moves unknown
