Deep Learning PyTorch Course, Handling Tensors

One of the basic components of deep learning is the tensor. A tensor represents an N-dimensional array and is used as a foundation for neural network training in PyTorch. In this course, we will learn in detail how to create and manipulate tensors in PyTorch.

1. Basic Understanding of Tensors

A tensor is fundamentally a set of numbers. A 0-dimensional tensor is called a scalar, a 1-dimensional tensor is a vector, a 2-dimensional tensor is a matrix, and a 3-dimensional tensor is known as a multi-dimensional array. PyTorch provides various functionalities to easily create and manipulate tensors.

1.1. Installing PyTorch

First, you need to install PyTorch. If you are using Anaconda, you can run the code below to install it:

conda install pytorch torchvision torchaudio cpuonly -c pytorch

2. Creating Tensors

There are several ways to create tensors in PyTorch. The most basic method is to use the torch.tensor() function.

2.1. Basic Tensor Creation

import torch

# Create tensor using a list
tensor1 = torch.tensor([1, 2, 3])
print(tensor1)

When you run the above code, you can get the following result:

tensor([1, 2, 3])

2.2. Various Ways to Create Tensors

In PyTorch, you can create tensors in various ways. For example:

  • torch.zeros(): Create a tensor where all elements are 0
  • torch.ones(): Create a tensor where all elements are 1
  • torch.arange(): Create a tensor with elements in a specified range
  • torch.randn(): Create a tensor following a normal distribution with mean 0 and standard deviation 1

Example Code

# Create various tensors
zeros_tensor = torch.zeros(3, 4)
ones_tensor = torch.ones(3, 4)
arange_tensor = torch.arange(0, 10, step=1)
random_tensor = torch.randn(3, 4)

print("Zeros Tensor:\n", zeros_tensor)
print("Ones Tensor:\n", ones_tensor)
print("Arange Tensor:\n", arange_tensor)
print("Random Tensor:\n", random_tensor)

3. Tensor Properties

Tensors have various properties. After creating a tensor, you can check its properties. Below are the key properties:

  • tensor.shape: The dimension (shape) of the tensor
  • tensor.dtype: The data type of the tensor
  • tensor.device: The device where the tensor exists (CPU or GPU)

Example Code

print("Shape:", tensor1.shape)
print("Data Type:", tensor1.dtype)
print("Device:", tensor1.device)

4. Tensor Operations

Tensors support various operations, ranging from basic arithmetic operations to advanced operations.

4.1. Basic Arithmetic Operations

tensor_a = torch.tensor([1, 2, 3])
tensor_b = torch.tensor([4, 5, 6])

# Addition
add_result = tensor_a + tensor_b
print("Addition Result:", add_result)

# Multiplication
mul_result = tensor_a * tensor_b
print("Multiplication Result:", mul_result)

4.2. Matrix Operations

Matrix multiplication can be performed using torch.mm() or the @ operator.

matrix_a = torch.tensor([[1, 2],
                              [3, 4]])

matrix_b = torch.tensor([[5, 6],
                          [7, 8]])

matrix_product = torch.mm(matrix_a, matrix_b)
print("Matrix Product:\n", matrix_product)

5. Tensor Slicing and Indexing

Since tensors are N-dimensional arrays, you can extract desired data through slicing and indexing.

5.1. Basic Indexing

tensor = torch.tensor([[1, 2, 3],
                           [4, 5, 6],
                           [7, 8, 9]])

# Element at the first row and second column
element = tensor[0, 1]
print("Element at (0, 1):", element)

5.2. Slicing

# Slicing all rows of the second column
slice_tensor = tensor[:, 1]
print("Slice Tensor:", slice_tensor)

6. Tensors and GPU

In PyTorch, you can utilize the GPU to accelerate operations. To move a tensor to the GPU, you can use the .to() method.

Example Code

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
tensor_gpu = tensor.to(device)
print("Tensor on GPU:", tensor_gpu)

7. Reshaping Tensors

As you work with tensors, there will often be a need to change their shape. To do this, you can use torch.view() or torch.reshape().

Example Code

reshaped_tensor = tensor.view(1, 9)
print("Reshaped Tensor:\n", reshaped_tensor)

8. Comprehensive Example

Now, let’s combine everything we have learned so far to create a simple neural network model. We will create a model to classify hand-written digits using the MNIST dataset.

Creating a PyTorch Model

import torchvision.transforms as transforms
from torchvision import datasets
from torch.utils.data import DataLoader

# Download and load dataset
transform = transforms.Compose([transforms.ToTensor()])
train_dataset = datasets.MNIST(root='./data', train=True, download=True, transform=transform)
train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True)

# Define a simple model for validation
import torch.nn as nn
import torch.optim as optim

class SimpleNN(nn.Module):
    def __init__(self):
        super(SimpleNN, self).__init__()
        self.fc1 = nn.Linear(28*28, 128)  # 28x28 is the size of MNIST images
        self.fc2 = nn.Linear(128, 10)      # 10 is the number of classes to classify

    def forward(self, x):
        x = x.view(-1, 28*28) # flatten the input
        x = torch.relu(self.fc1(x))
        x = self.fc2(x)
        return x

# Setting up the model, loss function, and optimizer
model = SimpleNN().to(device)
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)

# Training loop
for epoch in range(5):  # Train for 5 epochs
    for batch_idx, (data, target) in enumerate(train_loader):
        data, target = data.to(device), target.to(device)

        optimizer.zero_grad()   # Reset previous gradients to zero
        output = model(data)    # Pass data through the model
        loss = criterion(output, target)  # Calculate loss
        loss.backward()         # Compute gradients
        optimizer.step()        # Update parameters

        if batch_idx % 100 == 0:
            print(f'Epoch: {epoch}, Batch: {batch_idx}, Loss: {loss.item()}')

In the code above, we built a simple neural network model to classify hand-written digits by training on the MNIST dataset. It includes the processes of creating tensors, performing operations, and running on the GPU.

Conclusion

In this tutorial, we learned various methods to create and manipulate tensors in PyTorch. Tensors are fundamental components of deep learning and play a crucial role in the model training and testing processes. In the next step, you can learn about more complex models and deep learning techniques.

Thank you!