-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path02_pytorch_nnclassification.py
514 lines (382 loc) · 84.7 KB
/
02_pytorch_nnclassification.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
# -*- coding: utf-8 -*-
"""02_pytorch_NNClassification.ipynb
Automatically generated by Colaboratory.
Original file is located at
https://colab.research.google.com/drive/163rKmTTVN6m4blbWzR2mHaCZBoYzq60q
"""
import torch
import torch.nn as nn
import torch.nn.functional as F
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import sklearn
from sklearn.datasets import make_circles
from sklearn.model_selection import train_test_split
"""## Make Classification Data and get ready
The `make_circles()` method from Scikit-Learn to generate two circles with different coloured dots.
"""
n_samples = 2000
X, y = make_circles(n_samples,
noise = 0.03,
random_state = 42)
len(X), len(y)
print(f"First 5 samples of X: \n{X[:5]}\n")
print(f"First 5 samples of y: \n{y[:5]}")
# Make a data frame of circle data
circles = pd.DataFrame({'X1': X[:, 0],
'X2': X[:, 1],
'label': y})
circles.head()
plt.scatter(x = X[:, 0],
y = X[:, 1],
c = y,
cmap = plt.cm.RdYlBu)
plt.xlabel('X1')
plt.ylabel('X2')
plt.show()
X.shape, y.shape
# Check different labels
circles.label.value_counts()
"""Turn data into tensors"""
X = torch.from_numpy(X).type(torch.float)
y = torch.from_numpy(y).type(torch.float)
X[:5], y[:5]
type(X), X.dtype, y.dtype
torch.manual_seed(42)
X_train, X_test, y_train, y_test = train_test_split(X, y, shuffle = True, test_size = 0.2, random_state = 42)
len(X_train), len(X_test)
"""## Building a Model
Build a model for classification
To do so, we need or have to
1. Setup device agnostic code, to run our code on an accelerator(GPU), if there is one
2. Construct a model
3. Define a loss function and optimizer
4. Create a training and testing loop
### Device Agnostic Code
"""
# Make a device agnostic code
device = 'cuda' if torch.cuda.is_available() else 'cpu'
device
"""### Construct a Model
Let's create a model class that:
1. Subclasses `nn.Module` (almost all PyTorch models are subclasses of nn.Module).
2. Creates 2 `nn.Linear` layers in the constructor capable of handling the input and output shapes of X and y.
3. Defines a `forward()` method containing the forward pass computation of the model.
4. Instantiates the model class and sends it to the target device.
"""
class NNCircleClassifier(nn.Module):
def __init__(self, in_features, h1, out_features):
super().__init__()
self.layer1 = nn.Linear(in_features, h1)
self.layer2 = nn.Linear(h1, out_features)
# self.two_linear_layers = nn.Sequential(
# nn.Linear(in_features = 2, outfeatures = 5),
# nn.Linear(in_features = 5, out_features = 1)
# )
def forward(self, x):
x = (self.layer1(x))
x = (self.layer2(x))
return x
model_0 = NNCircleClassifier(in_features = 2, h1 = 5, out_features = 1).to(device)
model_0
model_0.state_dict()
# model_0 = nn.Sequential(
# nn.Linear(in_features = 2, outfeatures = 5),
# nn.Linear(in_features = 5, out_features = 1)
# ).to(device)
"""### Device Loss Function and Optimizer
![image.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAnEAAACWCAYAAACxU94rAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAANPqSURBVHhe7N0HoCZHcSfwkXaVVgFJCCQEioAkcs7BZJMxYMBkZGwcsO8w9jmcz+nO5s5nn7NxANskE2SDyFGIJEBCEsoSklBEOee04V3/et5/t3f4vhd2V9qg+e/Om5me7urqqurq6p75ZraaKegGkLTVVlv92PGmhAlsr4VNkecRGx6bg63emRj2g9HuR4wYMeLug9VBXDsArlq1qtt6661/7HhDYjj4DHFnD0Zz1T8OhJsPWrttjzcHDG1wXXmfZsujHY8YMWLElo2JQdy0QWExGAeQESPmxrCfrU+fmdRnxz44YsSIEVs2JgZxmyImDVKLwbq2bVq9c/Ezqa4tfUC9s+3nztb/YvW5oTCsd0u3kxEjRowYseFwl91OnWuQHGIcyH4c9GBbunTpvDqJrCPH22+/ve632WabtcqtWLGinm8o/aKnDnC8fPnybocddqjnGxpkkPYN29vaMmzK9jTkdRImtQ825XaNGDFixIg7HxvtmbgRi4egKEHSQtDqdIi5rs2FaeUEbQJMuO2227rtt9++8pu0MeBYf6yrzkaMGDFixJaJqc/EtcdHH310t+2229bzYJddduke8IAHzJ7Nj+OPP777wQ9+MHvWdYccckh3z3veszvggANmU9bgvPPO666++uq1BqwcZ//IRz6y7uHEE0+stPbZZ5/ZlLXxox/9qLvlllvq8TSef/jDH9b98Lp0aUuWLKnn+Lrwwgvr8UKw7777Vt7C9wknnNDd+9737u573/vW80m4+OKLuyuuuGJivtNOO63bY489uj333HM2ZX7QocDqkksu6c4444zu/PPP7+5xj3tU2gcddFB3v/vdbzbn/LjyyiurLskBXXR23XXX7rGPfWwNMNWz3XbbrQ42teX666+vdbAZuOGGG6qOFwo2omw7oTj33HO7Y445prv55pu7ZcuWVVkdfPDBtR58tZOQiy66qLvjjjt+TLdDO5+Ec845pzv99NNrewH9hz/84QuS/+WXX96dfPLJtX7BLL3tv//+3YMe9KDZHGsDr/TDnvGrXXvvvXf30Ic+tMq47Q8jRowYMWLE6iCuRTu4fetb3+p+7dd+beIgJxB78Ytf3L32ta+dTflxfP/73+/+3//7fzX4mISXv/zl3e///u+vNZi+9a1vreVatKuBD3zgA7u/+Iu/WB3gvOMd7+guvfTStdJavOtd7+oOO+yw7qd+6qe6P/zDP5xNXQMBwS//8i93T3ziE9e6/vWvf73S/qu/+qvuGc94RuXtpJNOqvwtFL/xG7+xWj4G81e/+tXdT//0T3fvfOc7a9okaPuv/MqvdL/1W7/VvexlL5tN7bpbb721e+Mb31gDlne/+92zqZOR1TA8C0Tkp0vpO+20U105E1zd//737174whd2v/qrvzpbco3+s4frrruue//739997GMfq+UE9XSycuXKSksA9bM/+7Pdi170opo/+MAHPtD98z//c/e3f/u33aMe9aia9sUvfrH7nd/5nXq8EPzv//2/u+c///mrV/ve8573VHoCa5t0cO3nfu7n6pYVQNfo9qabbuo+/OEP17QW2gjDAInMtPczn/lMPR+uRr/+9a/v3vCGN1RdQCsrOOKII6o9CuRAeXLbbbfduqc+9andr//6r3e777571REIEv/pn/6pO/zww6uepdMVCGLf9ra3dT/xEz+xOhAeMWLEiBEj5g3iDLj/9b/+1+41r3lN95CHPGT1oG1V50tf+lINTAQbBs7cPkvZb37zm91/+2//ra4wCFye9rSndTvuuGNdPRF0CZIMcgIMqxRw4403dm95y1u6yy67rA5cBmmrEoIGdA1sVrZe8IIX1BUf+Mu//MtKQ8DwpCc9qaaBdhg4X/e613Xf+973usc97nHdhz70oVq+xde+9rXKvwBOkJT2a7sAAG1BBFhZOvLII2secvDMl9UTwY32PfOZz6z8BlZdBIdgJVJA94pXvKL7vd/7vZqWulqZf+Mb36iB4v/8n/+z8h6Qm0BUoPre9753daAC4ccKmGNA77jjjuv++3//790FF1zQ/czP/Ezl8T73uU99Tk6g8ulPf7rqSTD9B3/wBzXIGN5CFwCRzSc+8YkagLz0pS+tq54777xz1Z8VMcHOS17yku63f/u312qLAO5v/uZvqm4e/ehHVxuxEnjUUUetDsDIkH4+9alPVT6e/OQn16ARDzZ1Cjbh3//936vstEMgZaXKKivZaovAyKQBb6A+OiW7D37wg3VFK2hlD+GZXATZZ511VrUzgbRy+DzzzDNroEVH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)
"""
# loss_fn = nn.BCELoss() --> this requires inputs to have gone through the sigmoid activation function prior to input going through BCE
loss_fn = nn.BCEWithLogitsLoss()
optimizer = torch.optim.SGD(params = model_0.parameters(),
lr = 0.01)
"""Define Accuracy Function"""
# Calculate accuracy
def accuracy_fn(y_true, y_pred):
correct = torch.eq(y_true, y_pred).sum().item()
acc = (correct/len(y_pred))*100
return acc
"""### Training Model
1. Set up training mode
2. Forward Pass
3. Calculate the Loss
4. Optimizer zero grad
5. Loss Backward
6. Optimizer Step
Going from *raw logits* ⟶ *prediction probabilities* ⟶ *prediction labels*
Our model outputs are going to be raw logits.
We have to convert them into **prediction probs** by passing them into some kind of activation function (e.g. sigmoid for BCE and softmax for for multiclass).
Then we we can convert *prediction probs* ⟶ *prediction labels* by either rounding them or taking the `argmax()`
"""
model_0.eval()
with torch.inference_mode():
y_logits = model_0((X_test.to(device))[:5])
y_logits
y_test[:5]
"""Use the sigmoid activation function on output logits, to turn them into pred probs"""
y_pred_probs = torch.sigmoid(y_logits)
y_pred_probs
"""For our *pred prob* values, we need to perform a range-style rounding on them:
* `y_pred_probs` `> =` `0.5` ⟹ `y=1` (class 1)
* `y_pred_probs` `< ` `0.5` ⟹ `y=0` (class 0)
"""
y_preds = torch.round(y_pred_probs)
# in one go
y_pred_labels = torch.round(torch.sigmoid(model_0(X_test.to(device)[:5])))
y_pred_labels
"""Building a Training Loop and a Testing Loop"""
torch.manual_seed(42)
epochs = 100
# batch_size = 32
X_train, y_train = X_train.to(device), y_train.to(device)
X_test, y_test = X_test.to(device), y_test.to(device)
epoch_count = []
train_losses = []
test_losses = []
train_accs = []
test_accs = []
for epoch in range(epochs):
model_0.train()
# 1. Forward Pass
y_logits = model_0.forward(X_train).squeeze()
y_pred = torch.round(torch.sigmoid(y_logits))
# 2. Calculate Loss / accuracy
# loss = nn.BCELoss(torch.sigmoids(y_logits), # nn.BCE expects prediction probabilities as input
# y_train)
loss = loss_fn(y_logits,
y_train) # remember nn.BCEwithLogits expects raw logits as it performs sigmoid by itself
acc = accuracy_fn(y_true = y_train,
y_pred = y_pred)
epoch_count.append(epoch)
train_losses.append(loss)
train_accs.append(acc)
# 3. Optimizer zero grad
optimizer.zero_grad()
# 4. Loss Backward
loss.backward()
# 5. Optimizer step
optimizer.step()
model_0.eval()
with torch.inference_mode():
# 1. Forward Pass
test_logits = model_0(X_test).squeeze()
test_preds = torch.round(torch.sigmoid(test_logits))
# 2. Calculate Loss/accuracy
test_loss = loss_fn(test_logits,
y_test)
test_acc = accuracy_fn(y_true = y_test,
y_pred = test_preds)
test_losses.append(test_loss)
test_accs.append(test_acc)
if epoch % 10 == 0:
print(f"Epoch: {epoch} | Train Loss: {loss: .5f}, | Train Acc: {acc: .2f}% | Test loss: {test_loss: .5f}, | Test Acc: {test_acc: .2f}%")
import matplotlib.pyplot as plt
def plot_decision_boundary(model, X, y):
X, y = X.to("cpu"), y.to("cpu") # CPU works better with NumPy and Matplotlib
# setup prediction boundaries
x1_min, x1_max = X[:, 0].min() - 0.1, X[:,0].max() + 0.1
x2_min, x2_max = X[:, 1].min() - 0.1, X[:,1].max() + 0.1
x1_ = np.linspace(x1_min, x1_max, 101) # creates evenly spaced 101 points between min and max
x2_ = np.linspace(x2_min, x2_max, 101)
x1x1, x2x2 = np.meshgrid(x1_, x2_) # creates a meshgrid --> useful for contour plot
xx1_ravel = x1x1.ravel()
xx2_ravel = x2x2.ravel()
# np.column_stack((x1_, x2_)) --> will simply add x2_ beside x1 and size is 101
# np.column_stack(xx1_ravel, xx2_ravel) --> will add each element of x2_ beside each element of x1_ and size is 10201
# because size of xx1 is 10201 which is flattened version of meshgrid
# Make features
X_to_pred_on = torch.from_numpy(np.column_stack((xx1_ravel, xx2_ravel))).float().to(device) # taking each x1 and x2 to create feature values
# make predictions
model.eval()
with torch.inference_mode():
y_logits = model(X_to_pred_on)
# Test for multiclass of binary
if (len(torch.unique(y)) > 2):
y_pred = torch.softmax(y_logits, dim = 1).argmax(dim=1)
else:
y_pred = torch.round(torch.sigmoid(y_logits)) #binary
y_pred = y_pred.reshape(x1x1.shape).detach().cpu().numpy()
plt.contourf(x1x1, x2x2, y_pred, cmap = plt.cm.RdYlBu, alpha = 0.7)
plt.scatter(X[:,0], X[:,1], c = y, s = 40, cmap = plt.cm.RdYlBu)
plt.xlim(x1x1.min(), x1x1.max())
plt.ylim(x2x2.min(), x2x2.max())
plt.figure(figsize = (12, 6))
plt.subplot(1, 2, 1)
plt.title("Train")
plot_decision_boundary(model_0, X_train, y_train)
plt.subplot(1, 2, 2)
plt.title("Test")
plot_decision_boundary(model_0, X_test, y_test)
"""## Improving our model
* Add more layers
* Add more nuerons in hidden units
* Change the activation functions
* Change the learning rate
* Change the loss function
"""
class CircleModelV1(nn.Module):
def __init__(self):
super().__init__()
self.layer1 = nn.Linear(in_features = 2, out_features = 10)
self.layer2 = nn.Linear(in_features = 10, out_features = 10)
self.layer3 = nn.Linear(in_features = 10, out_features = 1)
def forward(self, x):
x = self.layer1(x)
x = F.relu(x)
x = self.layer2(x)
x = F.relu(x)
x = self.layer3(x)
return x
model_1 = CircleModelV1().to(device)
model_1
model_1.state_dict()
# loss_fn = nn.BCELoss() --> this requires inputs to have gone through the sigmoid activation function prior to input going through BCE
loss_fn = nn.BCEWithLogitsLoss()
optimizer = torch.optim.SGD(params = model_1.parameters(),
lr = 0.1)
# Calculate accuracy
def accuracy_fn(y_true, y_pred):
correct = torch.eq(y_true, y_pred).sum().item()
acc = (correct/len(y_pred))*100
return acc
torch.manual_seed(42)
epochs = 1000
X_train, y_train = X_train.to(device), y_train.to(device)
X_test, y_test = X_test.to(device), y_test.to(device)
epoch_count = []
train_losses = []
test_losses = []
train_accs = []
test_accs = []
for epoch in range(epochs):
model_1.train()
# 1. Forward Pass
y_logits = model_1.forward(X_train).squeeze()
y_pred = torch.round(torch.sigmoid(y_logits))
# 2. Calculate Loss / accuracy
# loss = nn.BCELoss(torch.sigmoids(y_logits), # nn.BCE expects prediction probabilities as input
# y_train)
loss = loss_fn(y_logits,
y_train) # remember nn.BCEwithLogits expects raw logits as it performs sigmoid by itself
acc = accuracy_fn(y_true = y_train,
y_pred = y_pred)
epoch_count.append(epoch)
train_losses.append(loss)
train_accs.append(acc)
# 3. Optimizer zero grad
optimizer.zero_grad()
# 4. Loss Backward
loss.backward()
# 5. Optimizer step
optimizer.step()
model_1.eval()
with torch.inference_mode():
# 1. Forward Pass
test_logits = model_1(X_test).squeeze()
test_preds = torch.round(torch.sigmoid(test_logits))
# 2. Calculate Loss/accuracy
test_loss = loss_fn(test_logits,
y_test)
test_acc = accuracy_fn(y_true = y_test,
y_pred = test_preds)
test_losses.append(test_loss)
test_accs.append(test_acc)
if epoch % 50 == 0:
print(f"Epoch: {epoch} | Train Loss: {loss: .5f}, | Train Acc: {acc: .2f}% | Test loss: {test_loss: .5f}, | Test Acc: {test_acc: .2f}%")
plt.figure(figsize = (12, 6))
plt.subplot(1, 2, 1)
plt.title("Train")
plot_decision_boundary(model_1, X_train, y_train)
plt.subplot(1, 2, 2)
plt.title("Test")
plot_decision_boundary(model_1, X_test, y_test)
"""## The missing piece - Non- Linearity
Neural Networks, rather than us telling the mdel what to learn, we give it the tools to discover patterns in data and it tries to figure out the patterns on its own
And these tools are linear & non-linear functions.
"""
class CircleModelV2(nn.Module):
def __init__(self):
super().__init__()
self.layer1 = nn.Linear(in_features = 2, out_features = 15)
self.layer2 = nn.Linear(in_features = 15, out_features = 10)
self.layer3 = nn.Linear(in_features = 10, out_features = 1)
def forward(self, x):
x = self.layer1(x)
x = F.relu(x)
x = self.layer2(x)
x = F.relu(x)
x = self.layer3(x)
return x
model_2 = CircleModelV2().to(device)
model_2
# loss_fn = nn.BCELoss() --> this requires inputs to have gone through the sigmoid activation function prior to input going through BCE
loss_fn = nn.BCEWithLogitsLoss()
optimizer = torch.optim.SGD(params = model_2.parameters(),
lr = 0.1)
# Calculate accuracy
def accuracy_fn(y_true, y_pred):
correct = torch.eq(y_true, y_pred).sum().item()
acc = (correct/len(y_pred))*100
return acc
torch.manual_seed(42)
torch.cuda.manual_seed(42)
epochs = 1000
X_train, y_train = X_train.to(device), y_train.to(device)
X_test, y_test = X_test.to(device), y_test.to(device)
epoch_count = []
train_losses = []
test_losses = []
train_accs = []
test_accs = []
for epoch in range(epochs):
model_2.train()
# 1. Forward Pass
y_logits = model_2.forward(X_train).squeeze()
y_pred = torch.round(torch.sigmoid(y_logits))
# 2. Calculate Loss / accuracy
loss = loss_fn(y_logits,
y_train)
acc = accuracy_fn(y_true = y_train,
y_pred = y_pred)
epoch_count.append(epoch)
train_losses.append(loss)
train_accs.append(acc)
# 3. Optimizer zero grad
optimizer.zero_grad()
# 4. Loss Backward
loss.backward()
# 5. Optimizer step
optimizer.step()
model_2.eval()
with torch.inference_mode():
# 1. Forward Pass
test_logits = model_2(X_test).squeeze()
test_preds = torch.round(torch.sigmoid(test_logits))
# 2. Calculate Loss/accuracy
test_loss = loss_fn(test_logits,
y_test)
test_acc = accuracy_fn(y_true = y_test,
y_pred = test_preds)
test_losses.append(test_loss)
test_accs.append(test_acc)
if epoch % 50 == 0:
print(f"Epoch: {epoch} | Train Loss: {loss: .5f}, | Train Acc: {acc: .2f}% | Test loss: {test_loss: .5f}, | Test Acc: {test_acc: .2f}%")
plt.figure(figsize = (12, 6))
plt.subplot(1, 2, 1)
plt.title("Train")
plot_decision_boundary(model_2, X_train, y_train)
plt.subplot(1, 2, 2)
plt.title("Test")
plot_decision_boundary(model_2, X_test, y_test)
plt.figure(figsize = (18, 6))
plt.subplot(1, 3, 1)
plt.title("1 H_layer with 5 units and NO activations")
plot_decision_boundary(model_0, X_train, y_train)
plt.subplot(1, 3, 2)
plt.title("2 H_layers with 10 units each and NO activations")
plot_decision_boundary(model_1, X_train, y_train)
plt.subplot(1, 3, 3)
plt.title("3 H_layers with 15 and 10 units respectively with activations")
plot_decision_boundary(model_2, X_train, y_train)