Daniel Voigt Godoy - Deep Learning with PyTorch Step-by-Step A Beginner’s Guide-leanpub
And then, we update our model configuration code to include the creation of thecorresponding function for the validation step.Define - Model Configuration V21 %%writefile model_configuration/v2.py23 device = 'cuda' if torch.cuda.is_available() else 'cpu'45 # Sets learning rate - this is "eta" ~ the "n"-like Greek letter6 lr = 0.178 torch.manual_seed(42)9 # Now we can create a model and send it at once to the device10 model = nn.Sequential(nn.Linear(1, 1)).to(device)1112 # Defines an SGD optimizer to update the parameters13 optimizer = optim.SGD(model.parameters(), lr=lr)1415 # Defines an MSE loss function16 loss_fn = nn.MSELoss(reduction='mean')1718 # Creates the train_step function for our model, loss function19 # and optimizer20 train_step_fn = make_train_step_fn(model, loss_fn, optimizer)2122 # Creates the val_step function for our model and loss function23 val_step_fn = make_val_step_fn(model, loss_fn) 11 Creating a function that performs a validation stepRun - Model Configuration V2%run -i model_configuration/v2.pyFinally, we need to change the training loop to include the evaluation of our model.The first step is to include another inner loop to handle the mini-batches that comefrom the validation loader, sending them to the same device as our model. Then,inside that inner loop, we use the validation step function to compute the loss. "Wait, this looks oddly familiar too…" Evaluation | 149
And indeed, it is—it is structurally the same as our mini-batch function (HelperFunction #2). So let’s use it once again!There is just one small, yet important detail to consider: Remember no_grad()?We used it in Chapter 1 to avoid messing with PyTorch’s dynamic computationgraph during the (manual) update of the parameters. And it is making a comebacknow—we need to use it to wrap our new validation’s inner loop:torch.no_grad(): Even though it won’t make a difference in oursimple model, it is a good practice to wrap the validation innerloop with this context manager [59] to disable any gradientcomputation that you may inadvertently trigger—gradientsbelong in training, not in validation steps.Now, our training loop should look like this:Define - Model Training V41 %%writefile model_training/v4.py23 # Defines number of epochs4 n_epochs = 20056 losses = []7 val_losses = [] 389 for epoch in range(n_epochs):10 # inner loop11 loss = mini_batch(device, train_loader, train_step_fn)12 losses.append(loss)1314 # VALIDATION - no gradients in validation!15 with torch.no_grad(): 116 val_loss = mini_batch(device, val_loader, val_step_fn)217 val_losses.append(val_loss) 31 Using no_grad() as context manager to prevent gradient computation2 Performing a validation step3 Keeping track of validation loss150 | Chapter 2: Rethinking the Training Loop
- Page 124 and 125: 41 optimizer.zero_grad() 34243 prin
- Page 126 and 127: Notebook Cell 1.8 - PyTorch’s los
- Page 128 and 129: Outputarray(0.00804466, dtype=float
- Page 130 and 131: Let’s build a proper (yet simple)
- Page 132 and 133: "What do we need this for?"It turns
- Page 134 and 135: 1 Instantiating a model2 What IS th
- Page 136 and 137: In the __init__() method, we create
- Page 138 and 139: LayersA Linear model can be seen as
- Page 140 and 141: There are MANY different layers tha
- Page 142 and 143: We use magic, just like that:%run -
- Page 144 and 145: • Step 1: compute model’s predi
- Page 146 and 147: RecapFirst of all, congratulations
- Page 148 and 149: Chapter 2Rethinking the Training Lo
- Page 150 and 151: Let’s take a look at the code onc
- Page 152 and 153: Higher-Order FunctionsAlthough this
- Page 154 and 155: def exponentiation_builder(exponent
- Page 156 and 157: Apart from returning the loss value
- Page 158 and 159: Our code should look like this; see
- Page 160 and 161: There is no need to load the whole
- Page 162 and 163: but if we want to get serious about
- Page 164 and 165: How does this change our code so fa
- Page 166 and 167: Run - Model Training V2%run -i mode
- Page 168 and 169: piece of code that’s going to be
- Page 170 and 171: for it. We could do the same for th
- Page 172 and 173: EvaluationHow can we evaluate the m
- Page 176 and 177: Run - Model Training V4%run -i mode
- Page 178 and 179: Loading Extension# Load the TensorB
- Page 180 and 181: browser, you’ll likely see someth
- Page 182 and 183: model’s graph (not quite the same
- Page 184 and 185: Figure 2.5 - Scalars on TensorBoard
- Page 186 and 187: Define - Model Training V51 %%write
- Page 188 and 189: If, by any chance, you ended up wit
- Page 190 and 191: The procedure is exactly the same,
- Page 192 and 193: soon, so please bear with me for no
- Page 194 and 195: After recovering our model’s stat
- Page 196 and 197: Run - Model Configuration V31 # %lo
- Page 198 and 199: This is the general structure you
- Page 200 and 201: Chapter 2.1Going ClassySpoilersIn t
- Page 202 and 203: # A completely empty (and useless)
- Page 204 and 205: # These attributes are defined here
- Page 206 and 207: # Creates the train_step function f
- Page 208 and 209: # Builds function that performs a s
- Page 210 and 211: setattrThe setattr function sets th
- Page 212 and 213: See? We effectively modified the un
- Page 214 and 215: the random seed as arguments.This s
- Page 216 and 217: The current state of development of
- Page 218 and 219: Lossesdef plot_losses(self):fig = p
- Page 220 and 221: Run - Data Preparation V21 # %load
- Page 222 and 223: Model TrainingWe start by instantia
And indeed, it is—it is structurally the same as our mini-batch function (Helper
Function #2). So let’s use it once again!
There is just one small, yet important detail to consider: Remember no_grad()?
We used it in Chapter 1 to avoid messing with PyTorch’s dynamic computation
graph during the (manual) update of the parameters. And it is making a comeback
now—we need to use it to wrap our new validation’s inner loop:
torch.no_grad(): Even though it won’t make a difference in our
simple model, it is a good practice to wrap the validation inner
loop with this context manager [59] to disable any gradient
computation that you may inadvertently trigger—gradients
belong in training, not in validation steps.
Now, our training loop should look like this:
Define - Model Training V4
1 %%writefile model_training/v4.py
2
3 # Defines number of epochs
4 n_epochs = 200
5
6 losses = []
7 val_losses = [] 3
8
9 for epoch in range(n_epochs):
10 # inner loop
11 loss = mini_batch(device, train_loader, train_step_fn)
12 losses.append(loss)
13
14 # VALIDATION - no gradients in validation!
15 with torch.no_grad(): 1
16 val_loss = mini_batch(device, val_loader, val_step_fn)2
17 val_losses.append(val_loss) 3
1 Using no_grad() as context manager to prevent gradient computation
2 Performing a validation step
3 Keeping track of validation loss
150 | Chapter 2: Rethinking the Training Loop