Подробное объяснение Tensor в яме Pytorch

PyTorch

Введение

Импульс развития фреймворка глубокого обучения Pytorch поразителен, и редактор также имеет глубокое понимание этого.Я просмотрел открытый исходный код глубокого обучения на Github и обнаружил, что Pytorch действительно много используется, поэтому редактор также в яму Пыторча захожу недавно, и напишите кстати.резюме статьи. Внимательно прочитав эту статью, вы получите:

  • Понимание создания тензора
  • Понимание тензорного ускорения
  • Общие свойства тензора
  • Общие способы понять Tensor

Создание тензора

Мы все должны знать, что Numpy — это общая библиотека расширений, которая поддерживает крупномасштабные операции с массивами и матрицами. Но для вычислительных графов, глубокого обучения или градиентов Numpy кажется действительно бессильным, потому что его вычисления нельзя ускорить на графическом процессоре, таком как Tensor. Сегодня поговорим о самой базовой концепции Pytorch, Tensor.

Тензоры — это n-мерные массивы, которые концептуально аналогичны массивам numpy, за исключением того, что тензоры могут отслеживать вычислительные графы и вычислительные градиенты.

1. Создать из Numpy

import torch
import numpy as np

numpy_array= np.array([1,2,3])
torch_tensor1 = torch.from_numpy(numpy_array)
torch_tensor2 = torch.Tensor(numpy_array)
torch_tensor3 = torch.tensor(numpy_array)

Стоит отметить, что torch.Tensor() является псевдонимом для типа тензора по умолчанию torch.FloatTensor(), что означает, что возвращаемый torch.Tensor() возвращает тип данных Float. Фактически, мы также можем изменить его тип данных по умолчанию:

torch.set_default_tensor_type(torch.DoubleTensor)

И torch.tensor() сгенерирует соответствующие torch.LongTensor, torch.FloatTensor и torch.DoubleTensor в соответствии с типом входных данных.

Конечно, мы также можем преобразовать Tensor в тип numpy через numpy().

numpy_array = torch_tensor1.numpy() # 如果tensor在CPU上
numpy_array = torch_tensor1.cpu.numpy() # 如果tensor在GPU上
print(type(numpy_array)) #输出 : <class 'numpy.ndarray'>

Обратите внимание, что если тензор находится на графическом процессоре, вам нужно использовать .cpu(), чтобы сначала преобразовать тензор графического процессора в процессор.

2. Создание из встроенных типов Python

lst = [1,2,3]
torch_tensor1 = torch.tensor(a)
tp = (1,2,3)
torch_tensor2  = torch.tensor(a1)

3. Другие способы

# 创建相同元素的Tensor
torch_tensor1  = torch.full([2,3],2)
# 创建全为1的Tensor
torch_tensor2 = torch.ones([2,3])
# 创建全为0的Tensor
torch_tensor3 = torch.zeors([2,3])
# 创建对角阵的Tensor
torch_tensor4  = torch.eye(3)
# 在区间[1,10]中随机创建Tensor
torch_tensor5 = torch.randint(1,10,[2,2])
# 等等...

Вы также можете указать тип данных и сохраняемое устройство при создании тензора.

torch_tensor= torch.zeros([2,3],dtype=torch.float64,device=torch.device('cuda:0'))
torch_tensor.dtype #torch.float64
torch_tensor.device #cuda:0
torch_tensor.is_cuda #True

Тензорное ускорение

Мы можем использовать следующие два способа ускорения Tensor на GPU.

Первый способ — определить типы данных cuda.

dtype = torch.cuda.FloatTensor
gpu_tensor = torch.randn(1,2).type(dtype) #把Tensor转换为cuda数据类型

Второй способ — поставить Tensor прямо на GPU (рекомендуется).

gpu_tensor = torch.randn(1,2).cuda(0)#把Tensor直接放在第一个GPU上
gpu_tensor = torch.randn(1,2).cuda(1)#把Tensor直接放在第二个GPU上

А поставить тензоры на ЦП очень просто.

cpu_tensor = gpu_tensor.cpu()

Общие свойства тензора

1. Просмотр свойств типа тензора

tensor1 = torch.ones([2,3])
tensor1.dtype # torch.float32

2. Просмотр свойств размера тензора

tensor1.shape # 尺寸
tenosr1.ndim #维度

3. Проверьте, хранится ли Tensor на GPU

tensor1.is_cuda #False

4. Просмотр тензорных устройств хранения

tensor1.device # cpu
tensor1.cuda(0)
tensor1.device # cuda:0

5. Просмотр расчета тензорного градиента

tensor1.grad

Общие методы Тензора

1.torch.squeeze(): удалить измерение со значением 1 и вернуть тензор

tensor1 = torch.ones([2,1,3])
torch_tensor1.size() #torch.Size([2, 1, 3])
tensor2=torch.squeeze(tensor1)
print(tensor2.size())#torch.Size([2, 3])

Из примера видно, что размерность Tensor изменилась с исходной [2,1,3] на [2,3], а размерность со значением 1 удалена.

2.torch.Tensor.permute() заменяет измерение Tensor и возвращает новое представление.

tensor1 = torch.ones([2,1,3])
print(tensor1.size()) # torch.Size([2, 1, 3])
tensor2 = tensor1.permute(2,1,0) # 0,1,2-> 2,1,0
print(tensor2.size()) # torch.Size([3, 1, 2])

Как видно из примера, Tensor будет иметь исходное значение первого измерения, равное 2, и значение второго измерения, равное 3, которые после замены станут равными 3 и 2 соответственно.

3.torch.Tensor.expand(): расширить измерение со значением 1. Расширенный тензор не будет выделять новую память, а только создаст новое представление и вернет его на основе оригинала.

>>>tensor1 = torch.tensor([[3],[2]])
>>>tensor2 = tensor1.expand(2,2)
>>>tensor1.size()
torch.Size([2, 1])
>>>tensor2
tensor([[3, 3],
        [2, 2]])
>>>tensor2.size()
torch.Size([2, 2])

Как видно из примера, исходная размерность Tensor равна (2,1), потому что функция состоит в том, чтобы расширить размерность со значением 1, поэтому его можно расширить до (2,2), (2,3 ) и т. д., но Обратите внимание, что размеры значений, отличных от 1, остаются неизменными.

4.torch.Tensor.repeat(): повторяет тензор определенной размерности.В отличие от Expand(), эта функция копирует исходные данные.

>>>tensor1 = torch.tensor([[3],[2]])
>>>tensor1.size()
torch.Size([2, 1])
>>>tensor2=tensor1.repeat(4,2)
>>>tensor2.size()
torch.Size([8, 2])
>>>tensor2
tensor([[3, 3],
        [2, 2],
        [3, 3],
        [2, 2],
        [3, 3],
        [2, 2],
        [3, 3],
        [2, 2]])

Размерность tensor1 в примере равна (2,1), tensor1.repeat(4,2), которая повторяется 4 раза и 2 раза для тензора 0-го измерения и 1-го измерения соответственно, поэтому размерность после повторения становится (8 ,2). Посмотрите еще раз на пример ниже.

>>>tensor1 = torch.tensor([[2,1]])
>>>tensor1.size()
torch.Size([1, 2])
>>>tensor2=tensor1.repeat(2,2,1)
>>>tensor2.size()
torch.Size([2,2,2])
>>>tensor2
tensor([[[2, 1],
         [2, 1]],

        [[2, 1],
         [2, 1]]])

Размерность tensor1 в примере равна (1,2), tensor1.repeat(2,2,1).На данный момент первый не соответствует размерности второго.На данный момент можно понять, что tensor1 переписывает размерность как (1,1, 2), а затем tensor1.repeat(2,2,1), тензор измерений 0, 1 и 2 tensor1 повторяется 1, 1 и 2 раза соответственно. После повторения размерность тензора равна (2, 2, 2).

Публичный номер: CVpython, сосредоточьтесь на совместном использовании Python и компьютерного зрения, мы настаиваем на оригинальности и время от времени обновляем, я надеюсь, что статья будет вам полезна, поторопитесь и отсканируйте код, чтобы обратить внимание.