# pytorch 模組化 https://www.learnpytorch.io/05_pytorch_going_modular/ The main concept of this section is: **turn useful notebook code cells into reusable Python files.** ![](https://i.imgur.com/fZsrHAt.png) ![](https://i.imgur.com/sCkGN77.png) ![](https://i.imgur.com/vywk5yk.png) --- ## 創立資料夾 ![](https://i.imgur.com/N4eel4r.png) ## Create Datasets and DataLoaders (data_setup.py) %%writefile going_modular/data_setup.py: 我把這個function寫成叫做data_setup.py檔存放在我創建的going_modular資料夾之下。 達到直接呼叫的功能: ![](https://i.imgur.com/cdaV1nv.png) ![](https://i.imgur.com/EREVS4X.png) ```python= %%writefile going_modular/data_setup.py import os from torchvision import datasets, transforms from torch.utils.data import DataLoader NUM_WORKERS = os.cpu_count() def create_dataloaders( train_dir: str, test_dir: str, transform: transforms.Compose, batch_size: int, num_workers: int=NUM_WORKERS ): """Creates training and testing DataLoaders. Takes in a training directory and testing directory path and turns them into PyTorch Datasets and then into PyTorch DataLoaders. Args: train_dir: Path to training directory. test_dir: Path to testing directory. transform: torchvision transforms to perform on training and testing data. batch_size: Number of samples per batch in each of the DataLoaders. num_workers: An integer for number of workers per DataLoader. Returns: A tuple of (train_dataloader, test_dataloader, class_names). Where class_names is a list of the target classes. Example usage: train_dataloader, test_dataloader, class_names = \ = create_dataloaders(train_dir=path/to/train_dir, test_dir=path/to/test_dir, transform=some_transform, batch_size=32, num_workers=4) """ # Use ImageFolder to create dataset(s) train_data = datasets.ImageFolder(train_dir, transform=transform) test_data = datasets.ImageFolder(test_dir, transform=transform) # Get class names class_names = train_data.classes # Turn images into data loaders train_dataloader = DataLoader( train_data, batch_size=batch_size, shuffle=True, num_workers=num_workers, pin_memory=True, ) test_dataloader = DataLoader( test_data, batch_size=batch_size, shuffle=True, num_workers=num_workers, pin_memory=True, ) return train_dataloader, test_dataloader, class_names ``` --- ## Making a model (model_builder.py) 達到直接呼叫的功效: ![](https://i.imgur.com/b4iFqN6.png) ```python= %%writefile going_modular/model_builder.py """ Contains PyTorch model code to instantiate a TinyVGG model. """ import torch from torch import nn class TinyVGG(nn.Module): """Creates the TinyVGG architecture. Replicates the TinyVGG architecture from the CNN explainer website in PyTorch. See the original architecture here: https://poloclub.github.io/cnn-explainer/ Args: input_shape: An integer indicating number of input channels. hidden_units: An integer indicating number of hidden units between layers. output_shape: An integer indicating number of output units. """ def __init__(self, input_shape: int, hidden_units: int, output_shape: int) -> None: super().__init__() self.conv_block_1 = nn.Sequential( nn.Conv2d(in_channels=input_shape, out_channels=hidden_units, kernel_size=3, stride=1, padding=0), nn.ReLU(), nn.Conv2d(in_channels=hidden_units, out_channels=hidden_units, kernel_size=3, stride=1, padding=0), nn.ReLU(), nn.MaxPool2d(kernel_size=2, stride=2) ) self.conv_block_2 = nn.Sequential( nn.Conv2d(hidden_units, hidden_units, kernel_size=3, padding=0), nn.ReLU(), nn.Conv2d(hidden_units, hidden_units, kernel_size=3, padding=0), nn.ReLU(), nn.MaxPool2d(2) ) self.classifier = nn.Sequential( nn.Flatten(), # Where did this in_features shape come from? # It's because each layer of our network compresses and changes the shape of our inputs data. nn.Linear(in_features=hidden_units*13*13, out_features=output_shape) ) def forward(self, x: torch.Tensor): x = self.conv_block_1(x) x = self.conv_block_2(x) x = self.classifier(x) return x # return self.classifier(self.conv_block_2(self.conv_block_1(x))) # <- leverage the benefits of operator fusion ``` ## Creating train_step() and test_step() functions and train() to combine them ![](https://i.imgur.com/06DHWdP.png) code:https://www.learnpytorch.io/05_pytorch_going_modular/ ## Creating a function to save the model (utils.py) code: ![](https://i.imgur.com/OPsKpC4.png) https://www.learnpytorch.io/05_pytorch_going_modular/ ## train.py全部包再一起 https://www.learnpytorch.io/05_pytorch_going_modular/