Рубрики
Без рубрики

Tensor Pytorch – подробный обзор

В этом учебном пособии Pytorch мы обсудим тензор Pytorch, которые являются строительными блоками этой глубокой структуры обучения. Давайте начнем! Pytorch Tensor

Автор оригинала: Pankaj Kumar.

В этом уроке Pytorch мы обсудим Тензор Pytorch , которые являются строительными блоками этой глубокой структуры обучения.

Давайте начнем!

Pytorch Tensor

Вы работали с Python Numpy раньше? Если да, то этот раздел будет очень просто для вас! Даже если у вас нет опыта работы с Numpy, вы можете легко перейти между Pytorch и Numpy!

Tensor в Pytorch похож на numpy Массивы с дополнительной гибкостью использования GPU для расчетов.

1. 2D Pytorch Tensor

Представьте себе тензор как массив чисел, с потенциально произвольным количеством размеров. Единственная разница между тензором и многомерным массивом в C/C ++/Java заключается в том, что размер всех столбцов в измерении одинаково.

Например, приведенное ниже может быть действительное представление 2-мерного тензора.

[[1 2 3 4],
 [5 6 7 8]]

Обратите внимание, однако, что приведенный ниже пример не является действительным примером, поскольку тензоры не являются зубчатыми массивами.

[[1 2 3 4],
 [5 6 7]]

Тензуры Pytorch действительно удобны для программистов, поскольку они почти такие же, как numpy массивы

Есть пара различий в numpy Однако методы, поэтому рекомендуется также относиться к официальной документации для получения дополнительной информации.

2. Инициализация пустой тензор Pytorch

Давайте рассмотрим пример ниже, который инициализирует пустой тензор.

import torch 
# Creates a 3 x 2 matrix which is empty
a = torch.empty(3, 2)

Пустой тензор делает Не означает, что это не содержит ничего. Это просто то, что на нем есть память.

import torch 
# Creates a 3 x 2 matrix which is empty
a = torch.empty(3, 2)
print(a)

# Create a zero initialized float tensor
b = torch.zeros(3, 2, dtype=torch.float32)
print(b)

Выход

tensor([[3.4655e-37, 0.0000e+00],
        [4.4842e-44, 0.0000e+00],
        [       nan, 6.1657e-44]])
tensor([[0., 0.],
        [0., 0.],
        [0., 0.]])

Первый тензор является результатом Pytorch просто выделения памяти для тензора. Какой бы предыдущий контент в памяти не стерта.

Второй тензор заполнен нулями, поскольку Pytorch выделяет память и ноль инициализирует тензорные элементы.

Обратите внимание на сходство с numpy.empty () и numpy.zeros () Отказ Это потому, что pytorch предназначен для замены numpy , так как GPU доступен.

3. Найти размер тензора Pytorch

Давайте создадим базовый тензор и определите его размер.

import torch 
# Create a tensor from data
c = torch.tensor([[3.2 , 1.6, 2], [1.3, 2.5 , 6.9]])
print(c)

Выход

tensor([[3.2000, 1.6000, 2.0000],
        [1.3000, 2.5000, 6.9000]])

Чтобы получить размер тензора, мы можем использовать Tensor.size ()

print(c.size())

Выход

torch.Size([2, 3])

Pytorch Tensor Operations

Как numpy Pytorch поддерживает аналогичные тензорные операции.

Сводка приведена в следующем блоке кода.

1. Основные математические операции на тензорах

import torch 
# Tensor Operations
x = torch.tensor([[2, 3, 4], [5, 6, 7]])
y = torch.tensor([[2, 3, 4], [1.3, 2.6, 3.9]])

# Addition
print(x + y)
# We can also use torch.add()
print(x + y == torch.add(x, y))

# Subtraction
print(x - y)
# We can also use torch.sub()
print(x-y == torch.sub(x, y))

Выход

tensor([[ 4.0000,  6.0000,  8.0000],
        [ 6.3000,  8.6000, 10.9000]])
tensor([[True, True, True],
        [True, True, True]])
tensor([[0.0000, 0.0000, 0.0000],
        [3.7000, 3.4000, 3.1000]])
tensor([[True, True, True],
        [True, True, True]])

Мы также можем назначить результат тензоре. Добавьте следующий фрагмент кода в код выше.

# We can assign the output to a tensor
z = torch.zeros(x.shape)
torch.add(x, y, out=z)
print(z)

Выход

tensor([[ 4.0000,  6.0000,  8.0000],
        [ 6.3000,  8.6000, 10.9000]])

2. Встроенное дополнение и вычитание с тензором Pytorch

Pytorch также поддерживает установленные операции, такие как добавление и вычитание, при суспензии с подчеркиванием (_). Давайте продолжемся с одинаковыми переменными от операционного сводного кода выше.

# In-place addition
print('Before In-Place Addition:', y)
y.add_(x)
print('After addition:', y)

Выход

Before In-Place Addition: tensor([[2.0000, 3.0000, 4.0000],
        [1.3000, 2.6000, 3.9000]])
After addition: tensor([[ 4.0000,  6.0000,  8.0000],
        [ 6.3000,  8.6000, 10.9000]])

3. Доступ к индексу Tensor

Мы также можем использовать Numpy на основе индексации в Pytorch

# Use numpy slices for indexing
print(y[:, 1]

Выход

tensor([6.0000, 8.6000])

Reshape Pytorch Tensor

Похоже на numpy мы можем использовать Torch.reeshape () изменить тензор. Мы также можем использовать Tensor.View () Для достижения такой же функциональности.

import torch 
x = torch.randn(5, 3)
# Return a view of the x, but only having 
# one dimension
y = x.view(5 * 3)

print('Size of x:', x.size())
print('Size of y:', y.size())

print(x)
print(y)

# Get back the original tensor with reshape()
z = y.reshape(5, 3)
print(z)

Выход

Size of x: torch.Size([5, 3])
Size of y: torch.Size([15])

tensor([[ 0.3224,  0.1021, -1.4290],
        [-0.3559,  0.2912, -0.1044],
        [ 0.3652,  2.3112,  1.4784],
        [-0.9630, -0.2499, -1.3288],
        [-0.0667, -0.2910, -0.6420]])

tensor([ 0.3224,  0.1021, -1.4290, -0.3559,  0.2912, -0.1044,  0.3652,  2.3112,
         1.4784, -0.9630, -0.2499, -1.3288, -0.0667, -0.2910, -0.6420])

tensor([[ 0.3224,  0.1021, -1.4290],
        [-0.3559,  0.2912, -0.1044],
        [ 0.3652,  2.3112,  1.4784],
        [-0.9630, -0.2499, -1.3288],
        [-0.0667, -0.2910, -0.6420]])

Список всех тензорных операций доступен в Pytorch’s Документация Отказ

Pytorch – Numpy Bridge

Мы можем преобразовать тензоры Pytorch для Numpy Archays и Vice-Versa довольно легко.

Pytorch спроектирован таким образом, что тензор факела на CPU и соответствующие numpy Массив будет иметь то же местоположение памяти. Поэтому, если вы измените один из них, другой будет автоматически изменить.

Чтобы доказать это, давайте проверим его, используя Torich.Numpy () и torich.from_numpy () методы.

Torich.Numpy () используется для преобразования тензора в размерный массив, а torich.from_numpy () сделаю обратное.

import torch 
# We also need to import numpy to declare numpy arrays
import numpy as np

a = torch.tensor([[1, 2, 3], [4, 5, 6]])
print('Original Tensor:', a)

b = a.numpy()
print('Tensor to a numpy array:', b)

# In-Place addition (add 2 to every element)
a.add_(2)

print('Tensor after addition:', a)

print('Numpy Array after addition:', b)

Выход

Original Tensor: tensor([[1, 2, 3],
        [4, 5, 6]])
Tensor to a numpy array: [[1 2 3]
 [4 5 6]]
Tensor after addition: tensor([[3, 4, 5],
        [6, 7, 8]])
Numpy Array after addition: [[3 4 5]
 [6 7 8]]

Действительно, Numpy Array также изменил его значение!

Давайте сделаем обратное также

import torch
import numpy as np

c = np.array([[4, 5, 6], [7, 8, 9]])
print('Numpy array:', c)

# Convert to a tensor
d = torch.from_numpy(c)
print('Tensor from the array:', d)

# Add 3 to each element in the numpy array
np.add(c, 3, out=c)

print('Numpy array after addition:', c)

print('Tensor after addition:', d)

Выход

Numpy array: [[4 5 6]
 [7 8 9]]
Tensor from the array: tensor([[4, 5, 6],
        [7, 8, 9]])
Numpy array after addition: [[ 7  8  9]
 [10 11 12]]
Tensor after addition: tensor([[ 7,  8,  9],
        [10, 11, 12]])

Примечание : Если вы не используете numpy Доступен на месте, используя А или np.add (out = a) Затем тензор не будет отражать изменения в массиве Numpy.

Например, если вы попробуете это:

c = np.add(c, 3)

Так как вы используете = Это означает, что Python создаст новый объект и назначает этот новый объект названным именем C Отказ Таким образом, оригинальное местоположение памяти все еще неизменено.

Используйте GPU CUDA с тензором Pytorch

Мы можем сделать NVIDIA CUDA GPU Выполните вычисления и ускоряйте, переместив тензор на GPU.

Примечание: Это относится только в том случае, если у вас есть GPU NVIDIA с CUDA включено. Если вы не уверены, что эти условия, я бы посоветовал вам искать в Интернете.

Мы можем проверить, есть ли у нас GPU для Pytorch, используя torch.cuda.is_available ()

import torch 
if torch.cuda.is_available():
    print('Your device is supported. We can use the GPU for PyTorch!')
else:
    print('Your GPU is either not supported by PyTorch or you haven't installed the GPU version')

Для меня это доступно, поэтому просто убедитесь, что вы устанавливаете CUDA, прежде чем продолжить дальше, если ваш ноутбук поддерживает его.

Мы можем переместить тензор от процессора в GPU, используя Tensor.to (устройство) , где устройство это объект устройства.

Это может быть torch.device ("Cuda") или просто CPU Отказ

import torch 
x = torch.tensor([1, 2, 3], dtype=torch.long)

if torch.cuda.is_available():
    print('CUDA is available')
    # Create a CUDA Device object
    device = torch.device("cuda")

    # Create a tensor from x and store on the GPU
    y = torch.ones_like(x, device=device)
    
    # Move the tensor from CPU to GPU
    x = x.to(device)

    # This is done on the GPU
    z = x + y
    print(z)

    # Move back to CPU and also change dtype
    print(z.to("cpu", torch.double))
    print(z)
else:
    print('CUDA is not available')

Выход

CUDA is available
tensor([2, 3, 4], device='cuda:0')
tensor([2., 3., 4.], dtype=torch.float64)
tensor([2, 3, 4], device='cuda:0')

Как видите, вывод показывает, что наша программа сейчас работает на GPU вместо этого!

Заключение

В этой статье мы узнали об использовании тензоров в Pytorch. Не стесняйтесь спрашивать любые сомнения или даже предложения/исправления в разделе «Комментарий» ниже!

Мы будем больше освещать в наших предстоящих учебных пособиях Pytorch. Следите за обновлениями!

Рекомендации