Daniel Voigt Godoy - Deep Learning with PyTorch Step-by-Step A Beginner’s Guide-leanpub

peiying410632
from peiying410632 More from this publisher
22.02.2024 Views

Helper Function #41 def index_splitter(n, splits, seed=13):2 idx = torch.arange(n)3 # Makes the split argument a tensor4 splits_tensor = torch.as_tensor(splits)5 # Finds the correct multiplier, so we don't have6 # to worry about summing up to N (or one)7 multiplier = n / splits_tensor.sum()8 splits_tensor = (multiplier * splits_tensor).long()9 # If there is a difference, throws at the first split10 # so random_split does not complain11 diff = n - splits_tensor.sum()12 splits_tensor[0] += diff13 # Uses PyTorch random_split to split the indices14 torch.manual_seed(seed)15 return random_split(idx, splits_tensor)Helper Function #51 def make_balanced_sampler(y):2 # Computes weights for compensating imbalanced classes3 classes, counts = y.unique(return_counts=True)4 weights = 1.0 / counts.float()5 sample_weights = weights[y.squeeze().long()]6 # Builds sampler with compute weights7 generator = torch.Generator()8 sampler = WeightedRandomSampler(9 weights=sample_weights,10 num_samples=len(sample_weights),11 generator=generator,12 replacement=True13 )14 return samplerPutting It All Together | 327

Data Preparation1 # Builds tensors from numpy arrays BEFORE split2 # Modifies the scale of pixel values from [0, 255] to [0, 1]3 x_tensor = torch.as_tensor(images / 255).float()4 y_tensor = torch.as_tensor(labels.reshape(-1, 1)).float()56 # Uses index_splitter to generate indices for training and7 # validation sets8 train_idx, val_idx = index_splitter(len(x_tensor), [80, 20])9 # Uses indices to perform the split10 x_train_tensor = x_tensor[train_idx]11 y_train_tensor = y_tensor[train_idx]12 x_val_tensor = x_tensor[val_idx]13 y_val_tensor = y_tensor[val_idx]1415 # Builds different composers because of data augmentation ontraining set16 train_composer = Compose([RandomHorizontalFlip(p=.5),17 Normalize(mean=(.5,), std=(.5,))])18 val_composer = Compose([Normalize(mean=(.5,), std=(.5,))])19 # Uses custom dataset to apply composed transforms to each set20 train_dataset = TransformedTensorDataset(21 x_train_tensor, y_train_tensor, transform=train_composer22 )23 val_dataset = TransformedTensorDataset(24 x_val_tensor, y_val_tensor, transform=val_composer25 )2627 # Builds a weighted random sampler to handle imbalanced classes28 sampler = make_balanced_sampler(y_train_tensor)2930 # Uses sampler in the training set to get a balanced data loader31 train_loader = DataLoader(32 dataset=train_dataset, batch_size=16, sampler=sampler33 )34 val_loader = DataLoader(dataset=val_dataset, batch_size=16)328 | Chapter 4: Classifying Images

Helper Function #4

1 def index_splitter(n, splits, seed=13):

2 idx = torch.arange(n)

3 # Makes the split argument a tensor

4 splits_tensor = torch.as_tensor(splits)

5 # Finds the correct multiplier, so we don't have

6 # to worry about summing up to N (or one)

7 multiplier = n / splits_tensor.sum()

8 splits_tensor = (multiplier * splits_tensor).long()

9 # If there is a difference, throws at the first split

10 # so random_split does not complain

11 diff = n - splits_tensor.sum()

12 splits_tensor[0] += diff

13 # Uses PyTorch random_split to split the indices

14 torch.manual_seed(seed)

15 return random_split(idx, splits_tensor)

Helper Function #5

1 def make_balanced_sampler(y):

2 # Computes weights for compensating imbalanced classes

3 classes, counts = y.unique(return_counts=True)

4 weights = 1.0 / counts.float()

5 sample_weights = weights[y.squeeze().long()]

6 # Builds sampler with compute weights

7 generator = torch.Generator()

8 sampler = WeightedRandomSampler(

9 weights=sample_weights,

10 num_samples=len(sample_weights),

11 generator=generator,

12 replacement=True

13 )

14 return sampler

Putting It All Together | 327

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!