PyTorch
Deep learning library
- 7 min read
- 5 chapters
Related on Lably
Through Open source, Deep learning and Library (computing)
PyTorch utilises the tensor as a fundamental data type, similarly to NumPy. Training is facilitated by a reversed automatic differentiation system, Autograd, that constructs a directed acyclic graph of the operations (and their arguments) executed by a model during its forward pass. With a loss, backpropagation is then undertaken.
As of 2025, PyTorch remains one of the most popular deep learning libraries, alongside others such as TensorFlow and Keras. It can be installed using Anaconda package managers. A number of commercial deep learning systems are built on top of PyTorch, including ChatGPT, Tesla Autopilot, Uber's Pyro, and Hugging Face's Transformers.
History
In 2001, Torch was written and released under a GPL by the Idiap Research Institute. It was a machine-learning library written in C++ and CUDA, supporting methods including neural networks, support vector machines (SVM), hidden Markov models, etc. Around 2010, it was rewritten by Ronan Collobert, Clement Farabet and Koray Kavuckuoglu. This was known as Torch7 or LuaTorch. This was written so that the backend was in C and the frontend was in Lua. In mid-2016, some developers refactored it to decouple the frontend and the backend, with strong influence from torch-autograd and Chainer. In turn, torch-autograd was influenced by HIPS/autograd. Development on Torch7 ceased in 2018 and was subsumed by the PyTorch project.
Meta (formerly known as Facebook) operates both PyTorch and Convolutional Architecture for Fast Feature Embedding (Caffe2), but models defined by the two frameworks were mutually incompatible. The Open Neural Network Exchange (ONNX) project was created by Meta and Microsoft in September 2017 to decouple deep learning frameworks from hardware-specific runtimes, allowing models to be converted between frameworks and optimized for execution providers like NVIDIA’s TensorRT. Caffe2 was merged into PyTorch at the end of March 2018. In September 2022, Meta announced that PyTorch would be governed by the independent PyTorch Foundation, a newly created subsidiary of the Linux Foundation.
PyTorch 2.0 was released on 15 March 2023, introducing TorchDynamo, a Python-level compiler that makes code run up to two times faster, along with significant improvements in training and inference performance across major cloud platforms.
Sign in to keep reading
4 more chapters are free with a Lably account.
PyTorch tensors
PyTorch defines a class called Tensor (torch.Tensor) to store and operate on homogeneous multidimensional rectangular arrays of numbers. PyTorch supports various sub-types of multi-dimensional arrays, or Tensors. PyTorch Tensors are similar to NumPy Arrays, but can also be operated on by a CUDA-capable NVIDIA GPU. PyTorch has also been developing support for other GPU platforms, for example, AMD's ROCm and Apple's Metal Framework.
PyTorch neural networks
PyTorch defines a module called nn (torch.nn) to describe neural networks and to support training. This module offers a comprehensive collection of building blocks for neural networks, including various layers and activation functions, enabling the construction of complex models. Networks are built by inheriting from the torch.nn module and defining the sequence of operations in the forward() function.
PyTorch Serialized File Format
Pytorch can save and load models using its own file format, which is a ZIP64 archive containing the model weights in a Python pickle file, and other information such as the byte order. The file extensions .pt and .pth are commonly used for these files.
Example
The following program shows the low-level functionality of the library with a simple example.
<span id="mwzw"></span><span class="linenos" data-line="1" id="mw0A"></span><span class="kn" id="mw0Q">import</span><span class="w" id="mw0g"> </span><span class="nn" id="mw0w">torch</span> <span class="linenos" data-line="2" id="mw1A"></span><span class="kp" id="mw1Q">dtype</span> <span class="o" id="mw1g">=</span> <span class="n" id="mw1w">torch</span><span class="o" id="mw2A">.</span><span class="n" id="mw2Q">float</span> <span class="linenos" data-line="3" id="mw2g"></span><span class="n" id="mw2w">device</span> <span class="o" id="mw3A">=</span> <span class="n" id="mw3Q">torch</span><span class="o" id="mw3g">.</span><span class="n" id="mw3w">device</span><span class="p" id="mw4A">(</span><span class="s2" id="mw4Q">"cpu"</span><span class="p" id="mw4g">)</span> <span class="c1" id="mw4w"># Execute all calculations on the CPU</span> <span class="linenos" data-line="4" id="mw5A"></span><span class="c1" id="mw5Q"># device = torch.device("cuda:0") # Executes all calculations on the GPU</span> <span class="linenos" data-line="5" id="mw5g"></span> <span class="linenos" data-line="6" id="mw5w"></span><span class="c1" id="mw6A"># Create a tensor and fill it with random numbers</span> <span class="linenos" data-line="7" id="mw6Q"></span><span class="n" id="mw6g">a</span> <span class="o" id="mw6w">=</span> <span class="n" id="mw7A">torch</span><span class="o" id="mw7Q">.</span><span class="n" id="mw7g">randn</span><span class="p" id="mw7w">(</span><span class="mi" id="mw8A">2</span><span class="p" id="mw8Q">,</span> <span class="mi" id="mw8g">3</span><span class="p" id="mw8w">,</span> <span class="n" id="mw9A">device</span><span class="o" id="mw9Q">=</span><span class="n" id="mw9g">device</span><span class="p" id="mw9w">,</span> <span class="kp" id="mw-A">dtype</span><span class="o" id="mw-Q">=</span><span class="kp" id="mw-g">dtype</span><span class="p" id="mw-w">)</span> <span class="linenos" data-line="8" id="mw_A"></span><span class="nb" id="mw_Q">print</span><span class="p" id="mw_g">(</span><span class="n" id="mw_w">a</span><span class="p" id="mwAQA">)</span> <span class="linenos" data-line="9" id="mwAQE"></span><span class="c1" id="mwAQI"># Output: tensor([[-1.1884, 0.8498, -1.7129],</span> <span class="linenos" data-line="10" id="mwAQM"></span><span class="c1" id="mwAQQ"># [-0.8816, 0.1944, 0.5847]])</span> <span class="linenos" data-line="11" id="mwAQU"></span> <span class="linenos" data-line="12" id="mwAQY"></span><span class="n" id="mwAQc">b</span> <span class="o" id="mwAQg">=</span> <span class="n" id="mwAQk">torch</span><span class="o" id="mwAQo">.</span><span class="n" id="mwAQs">randn</span><span class="p" id="mwAQw">(</span><span class="mi" id="mwAQ0">2</span><span class="p" id="mwAQ4">,</span> <span class="mi" id="mwAQ8">3</span><span class="p" id="mwARA">,</span> <span class="n" id="mwARE">device</span><span class="o" id="mwARI">=</span><span class="n" id="mwARM">device</span><span class="p" id="mwARQ">,</span> <span class="kp" id="mwARU">dtype</span><span class="o" id="mwARY">=</span><span class="kp" id="mwARc">dtype</span><span class="p" id="mwARg">)</span> <span class="linenos" data-line="13" id="mwARk"></span><span class="nb" id="mwARo">print</span><span class="p" id="mwARs">(</span><span class="n" id="mwARw">b</span><span class="p" id="mwAR0">)</span> <span class="linenos" data-line="14" id="mwAR4"></span><span class="c1" id="mwAR8"># Output: tensor([[ 0.7178, -0.8453, -1.3403],</span> <span class="linenos" data-line="15" id="mwASA"></span><span class="c1" id="mwASE"># [ 1.3262, 1.1512, -1.7070]])</span> <span class="linenos" data-line="16" id="mwASI"></span> <span class="linenos" data-line="17" id="mwASM"></span><span class="nb" id="mwASQ">print</span><span class="p" id="mwASU">(</span><span class="n" id="mwASY">a</span> <span class="o" id="mwASc">*</span> <span class="n" id="mwASg">b</span><span class="p" id="mwASk">)</span> <span class="linenos" data-line="18" id="mwASo"></span><span class="c1" id="mwASs"># Output: tensor([[-0.8530, -0.7183, 2.58],</span> <span class="linenos" data-line="19" id="mwASw"></span><span class="c1" id="mwAS0"># [-1.1692, 0.2238, -0.9981]])</span> <span class="linenos" data-line="20" id="mwAS4"></span> <span class="linenos" data-line="21" id="mwAS8"></span><span class="nb" id="mwATA">print</span><span class="p" id="mwATE">(</span><span class="n" id="mwATI">a</span><span class="o" id="mwATM">.</span><span class="kp" id="mwATQ">sum</span><span class="p" id="mwATU">())</span> <span class="linenos" data-line="22" id="mwATY"></span><span class="c1" id="mwATc"># Output: tensor(-2.1540)</span> <span class="linenos" data-line="23" id="mwATg"></span> <span class="linenos" data-line="24" id="mwATk"></span><span class="nb" id="mwATo">print</span><span class="p" id="mwATs">(</span><span class="n" id="mwATw">a</span><span class="p" id="mwAT0">[</span><span class="mi" id="mwAT4">1</span><span class="p" id="mwAT8">,</span> <span class="mi" id="mwAUA">2</span><span class="p" id="mwAUE">])</span> <span class="c1" id="mwAUI"># Output of the element in the third column of the second row (zero-based)</span> <span class="linenos" data-line="25" id="mwAUM"></span><span class="c1" id="mwAUQ"># Output: tensor(0.5847)</span> <span class="linenos" data-line="26" id="mwAUU"></span> <span class="linenos" data-line="27" id="mwAUY"></span><span class="nb" id="mwAUc">print</span><span class="p" id="mwAUg">(</span><span class="n" id="mwAUk">a</span><span class="o" id="mwAUo">.</span><span class="kp" id="mwAUs">max</span><span class="p" id="mwAUw">())</span> <span class="linenos" data-line="28" id="mwAU0"></span><span class="c1" id="mwAU4"># Output: tensor(0.8498)</span>The following code block defines a neural network with linear layers using the nn module.
<span id="mwAVM"></span><span class="linenos" data-line="1" id="mwAVQ"></span><span class="kn" id="mwAVU">from</span><span class="w" id="mwAVY"> </span><span class="nn" id="mwAVc">torch</span><span class="w" id="mwAVg"> </span><span class="kn" id="mwAVk">import</span> <span class="n" id="mwAVo">nn</span> <span class="c1" id="mwAVs"># Import the nn sub-module from PyTorch</span> <span class="linenos" data-line="2" id="mwAVw"></span> <span class="linenos" data-line="3" id="mwAV0"></span><span class="k" id="mwAV4">class</span><span class="w" id="mwAV8"> </span><span class="nc" id="mwAWA">NeuralNetwork</span><span class="p" id="mwAWE">(</span><span class="n" id="mwAWI">nn</span><span class="o" id="mwAWM">.</span><span class="n" id="mwAWQ">Module</span><span class="p" id="mwAWU">):</span> <span class="c1" id="mwAWY"># Neural networks are defined as classes</span> <span class="linenos" data-line="4" id="mwAWc"></span> <span class="k" id="mwAWg">def</span><span class="w" id="mwAWk"> </span><span class="fm" id="mwAWo">__init__</span><span class="p" id="mwAWs">(</span><span class="bp" id="mwAWw">self</span><span class="p" id="mwAW0">):</span> <span class="c1" id="mwAW4"># Layers and variables are defined in the __init__ method</span> <span class="linenos" data-line="5" id="mwAW8"></span> <span class="nb" id="mwAXA">super</span><span class="p" id="mwAXE">()</span><span class="o" id="mwAXI">.</span><span class="fm" id="mwAXM">__init__</span><span class="p" id="mwAXQ">()</span> <span class="c1" id="mwAXU"># Must be in every network.</span> <span class="linenos" data-line="6" id="mwAXY"></span> <span class="bp" id="mwAXc">self</span><span class="o" id="mwAXg">.</span><span class="n" id="mwAXk">flatten</span> <span class="o" id="mwAXo">=</span> <span class="n" id="mwAXs">nn</span><span class="o" id="mwAXw">.</span><span class="n" id="mwAX0">Flatten</span><span class="p" id="mwAX4">()</span> <span class="c1" id="mwAX8"># Construct a flattening layer.</span> <span class="linenos" data-line="7" id="mwAYA"></span> <span class="bp" id="mwAYE">self</span><span class="o" id="mwAYI">.</span><span class="n" id="mwAYM">linear_relu_stack</span> <span class="o" id="mwAYQ">=</span> <span class="n" id="mwAYU">nn</span><span class="o" id="mwAYY">.</span><span class="n" id="mwAYc">Sequential</span><span class="p" id="mwAYg">(</span> <span class="c1" id="mwAYk"># Construct a stack of layers.</span> <span class="linenos" data-line="8" id="mwAYo"></span> <span class="n" id="mwAYs">nn</span><span class="o" id="mwAYw">.</span><span class="n" id="mwAY0">Linear</span><span class="p" id="mwAY4">(</span><span class="mi" id="mwAY8">28</span> <span class="o" id="mwAZA">*</span> <span class="mi" id="mwAZE">28</span><span class="p" id="mwAZI">,</span> <span class="mi" id="mwAZM">512</span><span class="p" id="mwAZQ">),</span> <span class="c1" id="mwAZU"># Linear Layers have an input and output shape</span> <span class="linenos" data-line="9" id="mwAZY"></span> <span class="n" id="mwAZc">nn</span><span class="o" id="mwAZg">.</span><span class="n" id="mwAZk">ReLU</span><span class="p" id="mwAZo">(),</span> <span class="c1" id="mwAZs"># ReLU is one of many activation functions provided by nn</span> <span class="linenos" data-line="10" id="mwAZw"></span> <span class="n" id="mwAZ0">nn</span><span class="o" id="mwAZ4">.</span><span class="n" id="mwAZ8">Linear</span><span class="p" id="mwAaA">(</span><span class="mi" id="mwAaE">512</span><span class="p" id="mwAaI">,</span> <span class="mi" id="mwAaM">512</span><span class="p" id="mwAaQ">),</span> <span class="linenos" data-line="11" id="mwAaU"></span> <span class="n" id="mwAaY">nn</span><span class="o" id="mwAac">.</span><span class="n" id="mwAag">ReLU</span><span class="p" id="mwAak">(),</span> <span class="linenos" data-line="12" id="mwAao"></span> <span class="n" id="mwAas">nn</span><span class="o" id="mwAaw">.</span><span class="n" id="mwAa0">Linear</span><span class="p" id="mwAa4">(</span><span class="mi" id="mwAa8">512</span><span class="p" id="mwAbA">,</span> <span class="mi" id="mwAbE">10</span><span class="p" id="mwAbI">),</span> <span class="linenos" data-line="13" id="mwAbM"></span> <span class="p" id="mwAbQ">)</span> <span class="linenos" data-line="14" id="mwAbU"></span> <span class="linenos" data-line="15" id="mwAbY"></span> <span class="k" id="mwAbc">def</span><span class="w" id="mwAbg"> </span><span class="nf" id="mwAbk">forward</span><span class="p" id="mwAbo">(</span><span class="bp" id="mwAbs">self</span><span class="p" id="mwAbw">,</span> <span class="n" id="mwAb0">x</span><span class="p" id="mwAb4">):</span> <span class="c1" id="mwAb8"># This function defines the forward pass.</span> <span class="linenos" data-line="16" id="mwAcA"></span> <span class="n" id="mwAcE">x</span> <span class="o" id="mwAcI">=</span> <span class="bp" id="mwAcM">self</span><span class="o" id="mwAcQ">.</span><span class="n" id="mwAcU">flatten</span><span class="p" id="mwAcY">(</span><span class="n" id="mwAcc">x</span><span class="p" id="mwAcg">)</span> <span class="linenos" data-line="17" id="mwAck"></span> <span class="n" id="mwAco">logits</span> <span class="o" id="mwAcs">=</span> <span class="bp" id="mwAcw">self</span><span class="o" id="mwAc0">.</span><span class="n" id="mwAc4">linear_relu_stack</span><span class="p" id="mwAc8">(</span><span class="n" id="mwAdA">x</span><span class="p" id="mwAdE">)</span> <span class="linenos" data-line="18" id="mwAdI"></span> <span class="k" id="mwAdM">return</span> <span class="n" id="mwAdQ">logits</span>

