A Beginner’s Guide to PyTorch
learn one of the most important Python packages to improve your career.
Image by Editor | Midjourney & Canva
Deep Learning is widely used in many areas of Artificial Intelligence research and has contributed to technological advancements. For example, text generation, facial recognition, and voice synthesis applications are based on deep learning research.
One of the most used Deep Learning packages is PyTorch. It is an open-source package created by Meta AI in 2016 and has since been used by many.
There are a lot of PyTorch advantages, including:
- Flexible model architecture
- Native Support for CUDA (Can use GPU)
- Python-based
- Providing lower-level controls, which are useful for research and many use cases
- Active development by the developer and community
Let's explore PyTorch with this article to help you get started.
Preparation
You should visit their installation webpage and select the one that suits your environment's requirements. The below code is the installation example.
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu
With the PyTorch ready, let's get into the central part.
PyTorch Tensor
Tensor is the building block in PyTorch. It is similar to the NumPy array but has access to a GPU. We can try to create a PyTorch Tensor using the following code:
a = torch.tensor([2, 4, 5])
print(a)
Output>>
tensor([2, 4, 5])
Like the NumPy array Tensor, it allows matrix operations.
e = torch.tensor([[1, 2, 3],
[4, 5, 6]])
f = torch.tensor([7, 8, 9])
print(e * f)
Output>>
tensor([[ 7, 16, 27],
[28, 40, 54]])
It’s also possible to perform the matrix multiplication.
g = torch.randn(2, 3)
h = torch.randn(3, 2)
print( g @ h)
Output>>
tensor([[-0.8357, 0.0583],
[-2.7121, 2.1980]])
We can access the Tensor information by using the code below.
x = torch.rand(3,4)
print("Shape:", x.shape)
print("Data type:", x.dtype)
print("Device:", x.device)
Output>>
Shape: torch.Size([3, 4])
Data type: torch.float32
Device: cpu
Neural Network Training with PyTorch
By defining the NN using the nn.Module class, we can develop a simple model. Let’s try it out with the code below.
import torch
class SimpleNet(nn.Module):
def __init__(self, input, hidden, output):
super(SimpleNet, self).__init__()
self.fc1 = torch.nn.Linear(input, hidden)
self.fc2 = torch.nn.Linear(hidden, output)
def forward(self, x):
x = torch.nn.functional.relu(self.fc1(x))
x = self.fc2(x)
return x
inp = 10
hid = 10
outp = 2
model = SimpleNet(inp, hid, out)
print(model)
Output>>
SimpleNet(
(fc1): Linear(in_features=10, out_features=10, bias=True)
(fc2): Linear(in_features=10, out_features=2, bias=True)
)
The above code defines a SimpleNet
class that inherits from nn.Module
, which sets up the layers. We use nn.Linear
is for the layers, and relu
as the activation function.
We can add more layers or use different layers like Conv2D or CNN. But we would not use that.
Next, we would train the SimpleNet
we developed with sample Tensor data.
import torch
inp = torch.randn(100, 10)
tar = torch.randint(0, 2, (100,))
criterion = torch.nn.CrossEntropyLoss()
optimizr = torch.optim.SGD(model.parameters(), lr=0.01)
epochs = 100
batchsize = 10
for epoch in range(numepochs):
model.train()
for i in range(0, inp.size(0), batchsize):
batch_inp = inputs[i:i+batch_size]
batch_tar = targets[i:i+batch_size]
out = model(batch_inp)
loss = criterion(out, batch_tar)
optimizer.zero_grad()
loss.backward()
optimizr.step()
if (epoch + 1) % 10 == 0:
print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {round(loss.item(),4})')
During the training above, we use random Tensor data and initiate the loss function called CrossEntropyLoss
. Also, we initiate the SGD optimizer to manage the model parameters to minimize the loss.
The training process runs multiple times according to the epoch numbers and then performs the optimization process. This is the usual deep-learning process.
We can add several steps to more complex training to improve training, like early stopping, learning rate, and other techniques.
Lastly, we can evaluate the model we have trained with the unseen data. The following code allows us to do that.
from sklearn.metrics import classification_report
model.eval()
test_inputs = torch.randn(20, 10)
test_targets = torch.randint(0, 2, (20,))
with torch.no_grad():
test_outputs = model(test_inputs)
_, predicted = torch.max(test_outputs, 1)
print(classification_report(test_targets, predicted))
What happened above is that we switched the model into the evaluation mode, which turned off dropout and batch normalization updates. Additionally, we disable the gradient computation process to speed up the process.
You can visit the PyTorch documentation to learn further about what you can do.
Conclusion
In this article, we will go through the basics of PyTorch. From tensor creation to tensor operations and developing a simple NN model. The article is an introductory level that every beginner should be able to follow quickly.
Cornellius Yudha Wijaya is a data science assistant manager and data writer. While working full-time at Allianz Indonesia, he loves to share Python and data tips via social media and writing media. Cornellius writes on a variety of AI and machine learning topics.