.. DO NOT EDIT. .. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. .. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: .. "beginner/blitz/tensor_tutorial.py" .. LINE NUMBERS ARE GIVEN BELOW. .. only:: html .. note:: :class: sphx-glr-download-link-note Click :ref:`here ` to download the full example code .. rst-class:: sphx-glr-example-title .. _sphx_glr_beginner_blitz_tensor_tutorial.py: Tensors ======== Tensors are a specialized data structure that are very similar to arrays and matrices. In PyTorch, we use tensors to encode the inputs and outputs of a model, as well as the model’s parameters. Tensors are similar to NumPy’s ndarrays, except that tensors can run on GPUs or other specialized hardware to accelerate computing. If you’re familiar with ndarrays, you’ll be right at home with the Tensor API. If not, follow along in this quick API walkthrough. .. GENERATED FROM PYTHON SOURCE LINES 15-20 .. code-block:: default import torch import numpy as np .. GENERATED FROM PYTHON SOURCE LINES 21-29 Tensor Initialization ~~~~~~~~~~~~~~~~~~~~~ Tensors can be initialized in various ways. Take a look at the following examples: **Directly from data** Tensors can be created directly from data. The data type is automatically inferred. .. GENERATED FROM PYTHON SOURCE LINES 29-33 .. code-block:: default data = [[1, 2], [3, 4]] x_data = torch.tensor(data) .. GENERATED FROM PYTHON SOURCE LINES 34-37 **From a NumPy array** Tensors can be created from NumPy arrays (and vice versa - see :ref:`bridge-to-np-label`). .. GENERATED FROM PYTHON SOURCE LINES 37-41 .. code-block:: default np_array = np.array(data) x_np = torch.from_numpy(np_array) .. GENERATED FROM PYTHON SOURCE LINES 42-45 **From another tensor:** The new tensor retains the properties (shape, datatype) of the argument tensor, unless explicitly overridden. .. GENERATED FROM PYTHON SOURCE LINES 45-53 .. code-block:: default x_ones = torch.ones_like(x_data) # retains the properties of x_data print(f"Ones Tensor: \n {x_ones} \n") x_rand = torch.rand_like(x_data, dtype=torch.float) # overrides the datatype of x_data print(f"Random Tensor: \n {x_rand} \n") .. rst-class:: sphx-glr-script-out .. code-block:: none Ones Tensor: tensor([[1, 1], [1, 1]]) Random Tensor: tensor([[0.8823, 0.9150], [0.3829, 0.9593]]) .. GENERATED FROM PYTHON SOURCE LINES 54-57 **With random or constant values:** ``shape`` is a tuple of tensor dimensions. In the functions below, it determines the dimensionality of the output tensor. .. GENERATED FROM PYTHON SOURCE LINES 57-70 .. code-block:: default shape = (2, 3,) rand_tensor = torch.rand(shape) ones_tensor = torch.ones(shape) zeros_tensor = torch.zeros(shape) print(f"Random Tensor: \n {rand_tensor} \n") print(f"Ones Tensor: \n {ones_tensor} \n") print(f"Zeros Tensor: \n {zeros_tensor}") .. rst-class:: sphx-glr-script-out .. code-block:: none Random Tensor: tensor([[0.3904, 0.6009, 0.2566], [0.7936, 0.9408, 0.1332]]) Ones Tensor: tensor([[1., 1., 1.], [1., 1., 1.]]) Zeros Tensor: tensor([[0., 0., 0.], [0., 0., 0.]]) .. GENERATED FROM PYTHON SOURCE LINES 71-73 -------------- .. GENERATED FROM PYTHON SOURCE LINES 76-80 Tensor Attributes ~~~~~~~~~~~~~~~~~ Tensor attributes describe their shape, datatype, and the device on which they are stored. .. GENERATED FROM PYTHON SOURCE LINES 80-88 .. code-block:: default tensor = torch.rand(3, 4) print(f"Shape of tensor: {tensor.shape}") print(f"Datatype of tensor: {tensor.dtype}") print(f"Device tensor is stored on: {tensor.device}") .. rst-class:: sphx-glr-script-out .. code-block:: none Shape of tensor: torch.Size([3, 4]) Datatype of tensor: torch.float32 Device tensor is stored on: cpu .. GENERATED FROM PYTHON SOURCE LINES 89-91 -------------- .. GENERATED FROM PYTHON SOURCE LINES 94-106 Tensor Operations ~~~~~~~~~~~~~~~~~ Over 100 tensor operations, including transposing, indexing, slicing, mathematical operations, linear algebra, random sampling, and more are comprehensively described `here `__. Each of them can be run on the GPU (at typically higher speeds than on a CPU). If you’re using Colab, allocate a GPU by going to Edit > Notebook Settings. .. GENERATED FROM PYTHON SOURCE LINES 106-113 .. code-block:: default # We move our tensor to the GPU if available if torch.cuda.is_available(): tensor = tensor.to('cuda') print(f"Device tensor is stored on: {tensor.device}") .. rst-class:: sphx-glr-script-out .. code-block:: none Device tensor is stored on: cuda:0 .. GENERATED FROM PYTHON SOURCE LINES 114-117 Try out some of the operations from the list. If you're familiar with the NumPy API, you'll find the Tensor API a breeze to use. .. GENERATED FROM PYTHON SOURCE LINES 119-120 **Standard numpy-like indexing and slicing:** .. GENERATED FROM PYTHON SOURCE LINES 120-125 .. code-block:: default tensor = torch.ones(4, 4) tensor[:,1] = 0 print(tensor) .. rst-class:: sphx-glr-script-out .. code-block:: none tensor([[1., 0., 1., 1.], [1., 0., 1., 1.], [1., 0., 1., 1.], [1., 0., 1., 1.]]) .. GENERATED FROM PYTHON SOURCE LINES 126-129 **Joining tensors** You can use ``torch.cat`` to concatenate a sequence of tensors along a given dimension. See also `torch.stack `__, another tensor joining op that is subtly different from ``torch.cat``. .. GENERATED FROM PYTHON SOURCE LINES 129-132 .. code-block:: default t1 = torch.cat([tensor, tensor, tensor], dim=1) print(t1) .. rst-class:: sphx-glr-script-out .. code-block:: none tensor([[1., 0., 1., 1., 1., 0., 1., 1., 1., 0., 1., 1.], [1., 0., 1., 1., 1., 0., 1., 1., 1., 0., 1., 1.], [1., 0., 1., 1., 1., 0., 1., 1., 1., 0., 1., 1.], [1., 0., 1., 1., 1., 0., 1., 1., 1., 0., 1., 1.]]) .. GENERATED FROM PYTHON SOURCE LINES 133-134 **Multiplying tensors** .. GENERATED FROM PYTHON SOURCE LINES 134-140 .. code-block:: default # This computes the element-wise product print(f"tensor.mul(tensor) \n {tensor.mul(tensor)} \n") # Alternative syntax: print(f"tensor * tensor \n {tensor * tensor}") .. rst-class:: sphx-glr-script-out .. code-block:: none tensor.mul(tensor) tensor([[1., 0., 1., 1.], [1., 0., 1., 1.], [1., 0., 1., 1.], [1., 0., 1., 1.]]) tensor * tensor tensor([[1., 0., 1., 1.], [1., 0., 1., 1.], [1., 0., 1., 1.], [1., 0., 1., 1.]]) .. GENERATED FROM PYTHON SOURCE LINES 141-142 This computes the matrix multiplication between two tensors .. GENERATED FROM PYTHON SOURCE LINES 143-148 .. code-block:: default print(f"tensor.matmul(tensor.T) \n {tensor.matmul(tensor.T)} \n") # Alternative syntax: print(f"tensor @ tensor.T \n {tensor @ tensor.T}") .. rst-class:: sphx-glr-script-out .. code-block:: none tensor.matmul(tensor.T) tensor([[3., 3., 3., 3.], [3., 3., 3., 3.], [3., 3., 3., 3.], [3., 3., 3., 3.]]) tensor @ tensor.T tensor([[3., 3., 3., 3.], [3., 3., 3., 3.], [3., 3., 3., 3.], [3., 3., 3., 3.]]) .. GENERATED FROM PYTHON SOURCE LINES 149-151 **In-place operations** Operations that have a ``_`` suffix are in-place. For example: ``x.copy_(y)``, ``x.t_()``, will change ``x``. .. GENERATED FROM PYTHON SOURCE LINES 151-156 .. code-block:: default print(tensor, "\n") tensor.add_(5) print(tensor) .. rst-class:: sphx-glr-script-out .. code-block:: none tensor([[1., 0., 1., 1.], [1., 0., 1., 1.], [1., 0., 1., 1.], [1., 0., 1., 1.]]) tensor([[6., 5., 6., 6.], [6., 5., 6., 6.], [6., 5., 6., 6.], [6., 5., 6., 6.]]) .. GENERATED FROM PYTHON SOURCE LINES 157-160 .. note:: In-place operations save some memory, but can be problematic when computing derivatives because of an immediate loss of history. Hence, their use is discouraged. .. GENERATED FROM PYTHON SOURCE LINES 162-164 -------------- .. GENERATED FROM PYTHON SOURCE LINES 167-173 .. _bridge-to-np-label: Bridge with NumPy ~~~~~~~~~~~~~~~~~ Tensors on the CPU and NumPy arrays can share their underlying memory locations, and changing one will change the other. .. GENERATED FROM PYTHON SOURCE LINES 176-178 Tensor to NumPy array ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. GENERATED FROM PYTHON SOURCE LINES 178-183 .. code-block:: default t = torch.ones(5) print(f"t: {t}") n = t.numpy() print(f"n: {n}") .. rst-class:: sphx-glr-script-out .. code-block:: none t: tensor([1., 1., 1., 1., 1.]) n: [1. 1. 1. 1. 1.] .. GENERATED FROM PYTHON SOURCE LINES 184-185 A change in the tensor reflects in the NumPy array. .. GENERATED FROM PYTHON SOURCE LINES 185-191 .. code-block:: default t.add_(1) print(f"t: {t}") print(f"n: {n}") .. rst-class:: sphx-glr-script-out .. code-block:: none t: tensor([2., 2., 2., 2., 2.]) n: [2. 2. 2. 2. 2.] .. GENERATED FROM PYTHON SOURCE LINES 192-194 NumPy array to Tensor ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. GENERATED FROM PYTHON SOURCE LINES 194-197 .. code-block:: default n = np.ones(5) t = torch.from_numpy(n) .. GENERATED FROM PYTHON SOURCE LINES 198-199 Changes in the NumPy array reflects in the tensor. .. GENERATED FROM PYTHON SOURCE LINES 199-202 .. code-block:: default np.add(n, 1, out=n) print(f"t: {t}") print(f"n: {n}") .. rst-class:: sphx-glr-script-out .. code-block:: none t: tensor([2., 2., 2., 2., 2.], dtype=torch.float64) n: [2. 2. 2. 2. 2.] .. rst-class:: sphx-glr-timing **Total running time of the script:** ( 0 minutes 0.131 seconds) .. _sphx_glr_download_beginner_blitz_tensor_tutorial.py: .. only:: html .. container:: sphx-glr-footer sphx-glr-footer-example .. container:: sphx-glr-download sphx-glr-download-python :download:`Download Python source code: tensor_tutorial.py ` .. container:: sphx-glr-download sphx-glr-download-jupyter :download:`Download Jupyter notebook: tensor_tutorial.ipynb ` .. only:: html .. rst-class:: sphx-glr-signature `Gallery generated by Sphinx-Gallery `_