YouTip LogoYouTip

Pytorch Torch Permute

## PyTorch torch.permute `torch.permute` is a fundamental PyTorch function used to rearrange (transpose) the dimensions of a tensor. It provides a flexible way to reorder multi-dimensional data, which is a common requirement in deep learning pipelines (such as converting image formats between channels-first and channels-last representations). --- ### Function Definition You can call this operation either as a torch function or directly as a method on a tensor object: ```python # Functional syntax torch.permute(input, dims) # Tensor method syntax tensor.permute(*dims) ``` #### Parameters: * **`input`** *(Tensor)*: The input tensor whose dimensions you want to rearrange. * **`dims`** *(tuple of python:ints)*: The desired ordering of dimensions. It must contain all the dimensions of the input tensor, indexed from `0` to `n-1` (where `n` is the number of dimensions). #### Returns: * A new tensor view with its dimensions permuted. --- ### Code Examples #### Example 1: Basic 3D Tensor Permutation In this example, we rearrange a 3D tensor of shape `(2, 3, 4)` to a new shape of `(4, 2, 3)`. ```python import torch # Create a 3D tensor with shape (2, 3, 4) x = torch.randn(2, 3, 4) print("Original shape:", x.shape) # Rearrange dimensions: # Original dimension at index 2 (size 4) becomes the new index 0 # Original dimension at index 0 (size 2) becomes the new index 1 # Original dimension at index 1 (size 3) becomes the new index 2 y = x.permute(2, 0, 1) print("Shape after permute:", y.shape) ``` **Output:** ```text Original shape: torch.Size([2, 3, 4]) Shape after permute: torch.Size([4, 2, 3]) ``` #### Example 2: Real-world Use Case (Image Format Conversion) Deep learning models often require different image formats. For example, PyTorch convolutional layers typically expect **Channels-First** format `(Batch, Channels, Height, Width)`, while visualization libraries like Matplotlib expect **Channels-Last** format `(Batch, Height, Width, Channels)`. ```python import torch # Simulate a batch of images: (Batch Size: 32, Channels: 3, Height: 224, Width: 224) images = torch.randn(32, 3, 224, 224) print("Original PyTorch format (B, C, H, W):", images.shape) # Convert to Channels-Last format (B, H, W, C) for visualization or export images_cl = images.permute(0, 2, 3, 1) print("Converted format (B, H, W, C):", images_cl.shape) ``` **Output:** ```text Original PyTorch format (B, C, H, W): torch.Size([32, 3, 224, 224]) Converted format (B, H, W, C): torch.Size([32, 224, 224, 3]) ``` --- ### Key Considerations 1. **Memory Layout (Views vs. Copies):** `torch.permute` returns a **view** of the original tensor whenever possible. This means it shares the underlying data storage with the original tensor and does not copy memory, making the operation extremely fast and memory-efficient. 2. **Contiguity:** Permuting a tensor changes its stride, which often makes the tensor **non-contiguous** in memory. If you attempt to perform operations that require contiguous memory (such as `.view()`) on a permuted tensor, PyTorch will throw an error. To resolve this, chain the `.contiguous()` method after permuting: ```python # This might raise a RuntimeError if y is not contiguous # z = y.view(new_shape) # Safe approach: z = y.contiguous().view(new_shape) ``` 3. **`permute` vs `transpose`:** * Use `torch.transpose` when you only need to swap **exactly two** dimensions. * Use `torch.permute` when you need to reorder **multiple** dimensions simultaneously.
← Pytorch Torch PoissonPytorch Torch Outer β†’