# Import the libraries we need for this labimport matplotlib.pyplot as plt import numpy as npimport torchimport torch.nn as nnimport torch.nn.functional as Ffrom matplotlib.colors import ListedColormapfrom torch.utils.data import Dataset, DataLoadertorch.manual_seed(1)
# Create Data Classclass Data(Dataset):# modified from: http://cs231n.github.io/neural-networks-case-study/# Constructordef__init__(self, K=3, N=500): D =2 X = np.zeros((N * K, D)) # data matrix (each row = single example) y = np.zeros(N * K, dtype='uint8') # class labelsfor j inrange(K): ix =range(N * j, N * (j +1)) r = np.linspace(0.0, 1, N) # radius t = np.linspace(j *4, (j +1) *4, N) + np.random.randn(N) *0.2# theta X[ix] = np.c_[r * np.sin(t), r*np.cos(t)] y[ix] = jself.y = torch.from_numpy(y).type(torch.LongTensor)self.x = torch.from_numpy(X).type(torch.FloatTensor)self.len= y.shape[0]# Getterdef__getitem__(self, index): returnself.x[index], self.y[index]# Get Lengthdef__len__(self):returnself.len# Plot the diagramdef plot_stuff(self): plt.plot(self.x[self.y[:] ==0, 0].numpy(), self.x[self.y[:] ==0, 1].numpy(), 'o', label="y = 0") plt.plot(self.x[self.y[:] ==1, 0].numpy(), self.x[self.y[:] ==1, 1].numpy(), 'ro', label="y = 1") plt.plot(self.x[self.y[:] ==2, 0].numpy(), self.x[self.y[:] ==2, 1].numpy(), 'go', label="y = 2") plt.legend()
Neural Network Module and Function for Training
Neural Network Module using ModuleList()
# Create Net model classclass Net(nn.Module):# Constructordef__init__(self, Layers):super(Net, self).__init__()self.hidden = nn.ModuleList()for input_size, output_size inzip(Layers, Layers[1:]):self.hidden.append(nn.Linear(input_size, output_size))# Predictiondef forward(self, activation): L =len(self.hidden)for (l, linear_transform) inzip(range(L), self.hidden):if l < L -1: activation = F.relu(linear_transform(activation))else: activation = linear_transform(activation)return activation
A function used to train.
# Define the function for training the modeldef train(data_set, model, criterion, train_loader, optimizer, epochs=100): LOSS = [] ACC = []for epoch inrange(epochs):for x, y in train_loader: optimizer.zero_grad() yhat = model(x) loss = criterion(yhat, y) optimizer.zero_grad() loss.backward() optimizer.step() LOSS.append(loss.item()) ACC.append(accuracy(model, data_set)) fig, ax1 = plt.subplots() color ='tab:red' ax1.plot(LOSS, color = color) ax1.set_xlabel('Iteration', color = color) ax1.set_ylabel('total loss', color = color) ax1.tick_params(axis ='y', color = color) ax2 = ax1.twinx() color ='tab:blue' ax2.set_ylabel('accuracy', color = color) # we already handled the x-label with ax1 ax2.plot(ACC, color = color) ax2.tick_params(axis ='y', color = color) fig.tight_layout() # otherwise the right y-label is slightly clipped plt.show()return LOSS
A function used to calculate accuracy
# The function to calculate the accuracydef accuracy(model, data_set): _, yhat = torch.max(model(data_set.x), 1)return (yhat == data_set.y).numpy().mean()
Train and Validate the Model
Crate a dataset object:
# Create a Dataset objectdata_set = Data()data_set.plot_stuff()data_set.y = data_set.y.view(-1)
Create a network to classify three classes with 1 hidden layer with 50 neurons
# Train the model with 1 hidden layer with 50 neuronsLayers = [2, 50, 3]model = Net(Layers)learning_rate =0.10optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)train_loader = DataLoader(dataset=data_set, batch_size=20)criterion = nn.CrossEntropyLoss()LOSS = train(data_set, model, criterion, train_loader, optimizer, epochs=100)plot_decision_regions_3class(model, data_set)
Create a network to classify three classes with 2 hidden layers with 20 neurons in total