Back to course overview

Tensorboard - PyTorch Beginner 16

Learn all the basics you need to get started with this deep learning framework! In this part we will learn about the TensorBoard and how we can use it to visualize and analyze our models. TensorBoard is a visualization toolkit that provides the visualization and tooling needed for machine learning experimentation:

We will learn: - How to install and use the TensorBoard in Pytorch - How to add images - How to add a model graph - How to visualize loss and accuracy during training - How to plot precision-recall curves

All code from this course can be found on GitHub.

Further readings

How to Log for Tensorboard

import torch import torch.nn as nn import torchvision import torchvision.transforms as transforms import matplotlib.pyplot as plt ############## TENSORBOARD ######################## import sys import torch.nn.functional as F from torch.utils.tensorboard import SummaryWriter # default `log_dir` is "runs" - we'll be more specific here writer = SummaryWriter('runs/mnist1') ################################################### # Device configuration device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') # Hyper-parameters input_size = 784 # 28x28 hidden_size = 500 num_classes = 10 num_epochs = 1 batch_size = 64 learning_rate = 0.001 # MNIST dataset train_dataset = torchvision.datasets.MNIST(root='./data', train=True, transform=transforms.ToTensor(), download=True) test_dataset = torchvision.datasets.MNIST(root='./data', train=False, transform=transforms.ToTensor()) # Data loader train_loader = torch.utils.data.DataLoader(dataset=train_dataset, batch_size=batch_size, shuffle=True) test_loader = torch.utils.data.DataLoader(dataset=test_dataset, batch_size=batch_size, shuffle=False) examples = iter(test_loader) example_data, example_targets = examples.next() for i in range(6): plt.subplot(2,3,i+1) plt.imshow(example_data[i][0], cmap='gray') #plt.show() ############## TENSORBOARD ######################## img_grid = torchvision.utils.make_grid(example_data) writer.add_image('mnist_images', img_grid) #writer.close() #sys.exit() ################################################### # Fully connected neural network with one hidden layer class NeuralNet(nn.Module): def __init__(self, input_size, hidden_size, num_classes): super(NeuralNet, self).__init__() self.input_size = input_size self.l1 = nn.Linear(input_size, hidden_size) self.relu = nn.ReLU() self.l2 = nn.Linear(hidden_size, num_classes) def forward(self, x): out = self.l1(x) out = self.relu(out) out = self.l2(out) # no activation and no softmax at the end return out model = NeuralNet(input_size, hidden_size, num_classes).to(device) # Loss and optimizer criterion = nn.CrossEntropyLoss() optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate) ############## TENSORBOARD ######################## writer.add_graph(model, example_data.reshape(-1, 28*28)) #writer.close() #sys.exit() ################################################### # Train the model running_loss = 0.0 running_correct = 0 n_total_steps = len(train_loader) for epoch in range(num_epochs): for i, (images, labels) in enumerate(train_loader): # origin shape: [100, 1, 28, 28] # resized: [100, 784] images = images.reshape(-1, 28*28).to(device) labels = labels.to(device) # Forward pass outputs = model(images) loss = criterion(outputs, labels) # Backward and optimize optimizer.zero_grad() loss.backward() optimizer.step() running_loss += loss.item() _, predicted = torch.max(outputs.data, 1) running_correct += (predicted == labels).sum().item() if (i+1) % 100 == 0: print (f'Epoch [{epoch+1}/{num_epochs}], Step [{i+1}/{n_total_steps}], Loss: {loss.item():.4f}') ############## TENSORBOARD ######################## writer.add_scalar('training loss', running_loss / 100, epoch * n_total_steps + i) writer.add_scalar('accuracy', running_correct / 100, epoch * n_total_steps + i) running_correct = 0 running_loss = 0.0 ################################################### # Test the model # In test phase, we don't need to compute gradients (for memory efficiency) class_labels = [] class_preds = [] with torch.no_grad(): n_correct = 0 n_samples = 0 for images, labels in test_loader: images = images.reshape(-1, 28*28).to(device) labels = labels.to(device) outputs = model(images) # max returns (value ,index) values, predicted = torch.max(outputs.data, 1) n_samples += labels.size(0) n_correct += (predicted == labels).sum().item() class_probs_batch = [F.softmax(output, dim=0) for output in outputs] class_preds.append(class_probs_batch) class_labels.append(predicted) # 10000, 10, and 10000, 1 # stack concatenates tensors along a new dimension # cat concatenates tensors in the given dimension class_preds = torch.cat([torch.stack(batch) for batch in class_preds]) class_labels = torch.cat(class_labels) acc = 100.0 * n_correct / n_samples print(f'Accuracy of the network on the 10000 test images: {acc} %') ############## TENSORBOARD ######################## classes = range(10) for i in classes: labels_i = class_labels == i preds_i = class_preds[:, i] writer.add_pr_curve(str(i), labels_i, preds_i, global_step=0) writer.close() ###################################################

FREE VS Code / PyCharm Extensions I Use

🪁 Code faster with Kite, AI-powered autocomplete: Link *

✅ Write cleaner code with Sourcery, instant refactoring suggestions: Link *

* These are affiliate links. By clicking on it you will not have any additional costs, instead you will support me and my project. Thank you! 🙏

Check out my Courses