Task: perform broadcast and reduction operations on a tensor representing a batch of color images
Goal: The goal of this exercise was just to get used to thinking about shapes of multidimensional structures. A surprisingly large amount of the thinking that goes into implementing neural net code is getting the shapes right. I didn’t really believe that until I had to figure it out myself a couple of times, and that convinced me that everyone could use some guided practice with that.
As usual, you don't need to understand the code in this section.
from fastai.vision.all import *
# Make one-channel images display in greyscale.
# See https://forums.fast.ai/t/show-image-displays-color-image-for-mnist-sample-dataset/78932/4
# But "Grays" is inverted, so we use "gray" instead.
matplotlib.rc('image', cmap='gray')
Download dataset.
path = untar_data(URLs.PETS) / "images"
Make a stable order for the images: first sort, then randomize using a known seed.
set_seed(333)
image_files = get_image_files(path).sorted().shuffle()
Define how we're going to split the data into a training and validation set.
splitter = RandomSplitter(valid_pct=0.2, seed=42)
In this dataset, cat breeds start with a capital letter, so we can get the label from the filename.
def cat_or_dog(x):
return 'cat' if x[0].isupper() else 'dog'
def get_y(file_path):
return cat_or_dog(file_path.name)
Define a standard image-classification DataBlock
.
dblock = DataBlock(blocks = (ImageBlock, CategoryBlock),
get_y = get_y,
splitter = splitter,
item_tfms = Resize(224))
Override shuffle_fn
so that the images never actually get shuffled (batch order is consistent).
dataloaders = dblock.dataloaders(image_files, batch_size=9, shuffle_fn=lambda idxs: idxs)
Since we set the shuffle_fn
to the identity above, the images will always get loaded in the same order, so the first batch will always be the same:
batch = dataloaders.train.one_batch()
images_orig, labels = batch
images = images_orig.clone() # make a copy that we can modify later.
show_image_batch((images, labels))