Тензоры в Pytorch

Тензоры в Pytorch Изучение

Pytorch Tensor в основном такой же, как массив NumPy. Это означает, что он ничего не знает о глубоком обучении, вычислительных графах или градиентах и ​​представляет собой просто общий n-мерный массив, который можно использовать для произвольных числовых вычислений. Однако самая большая разница между массивом NumPy и PyTorch Tensor заключается в том, что PyTorch Tensor может работать как на CPU, так и на GPU. Чтобы запускать операции на графическом процессоре, просто приведите Tensor к типу данных cuda, используя:

device = torch.device(“cpu”)

# to create random input and output data ,

# and H is hidden dimension; D_out is output dimension.

N, D_in, H, D_out = 32, 100, 10, 2

x = torch.randn(N, D_in, device=device, dtype=torch.float)    #where x is a tensor

В приведенном выше примере x можно рассматривать как тензор случайных признаков в качестве входных данных для модели. В этой статье мы увидим, как создавать тензоры, различные атрибуты и операции с тензором.

Как создать тензор?

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

import torch
V_data = [1, 2, 3, 4, 5]
V = torch.tensor(V_data)
print(V)

Выход:

tensor([1, 2, 3, 4, 5])

Вы также можете создать тензор случайных данных с заданной размерностью, например:

import torch
 
x = torch.randn((3, 4, 5))
print(x)

Выход :

tensor([[[ 0.8332, -0.2102,  0.0213,  0.4375, -0.9506],
         [ 0.0877, -1.5845, -0.1520,  0.3944, -0.7282],
         [-0.6923,  0.0332, -0.4628, -0.9127, -1.4349],
         [-0.3641, -0.5880, -0.5963, -1.4126,  0.5308]],

        [[ 0.4492, -1.2030,  2.5985,  0.8966,  0.4876],
         [ 0.5083,  1.4515,  0.6496,  0.3407,  0.0093],
         [ 0.1237,  0.3783, -0.7969,  1.4019,  0.0633],
         [ 0.4399,  0.3827,  1.2231, -0.0674, -1.0158]],

        [[-0.2490, -0.5475,  0.6201, -2.2092,  0.8405],
         [ 0.1684, -1.0118,  0.7414, -3.3518, -0.3209],
         [ 0.6543,  0.1956, -0.2954,  0.1055,  1.6523],
         [-0.9872, -2.0118, -1.6609,  1.4072,  0.0632]]])

Вы также можете создавать тензоры, используя следующие функции:

  • torch.zeros(): создает новый тензор со всеми элементами, инициализированными нулями.
import torch
 
z= torch.zeros([3,3], dtype=torch.int32)
print(z)

Выход:

tensor([[0, 0, 0],
        [0, 0, 0],
        [0, 0, 0]], dtype=torch.int32)
  • torch.ones(): создает новый тензор со всеми элементами, инициализированными как единицы.
import torch
 
z = torch.ones([3,3])
print(z)

Выход:

tensor([[1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.]])
  • torch.full() and torch.full_like():  эти функции возвращают тензор требуемого размера, заполненный требуемым значением fill_value. Полный прототип torch.full ():
Читайте также:  Подробное описание стратегий развертывания Kubernetes

Syntax: torch.full(size, fill_value, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)

И torch.full_like () :

Syntax: torch.full_like(input, fill_value, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False, memory_format=torch.preserve_format)

import torch
 
# example of torch.full()
newTensor= torch.full((4, 3), 3.14,dtype= torch.float32)
print(newTensor)

Выход:

tensor([[3.1400, 3.1400, 3.1400],
        [3.1400, 3.1400, 3.1400],
        [3.1400, 3.1400, 3.1400],
        [3.1400, 3.1400, 3.1400]])
import torch
 
# Example for torch.full_like()
x = torch.full_like(newTensor,3.24, dtype=None )
print(x)

Выход:

tensor([[3.2400, 3.2400, 3.2400],
        [3.2400, 3.2400, 3.2400],
        [3.2400, 3.2400, 3.2400],
        [3.2400, 3.2400, 3.2400]])

Здесь возвращается новый Tensor с тем же размером и dtype, что и newTensor, который ранее был возвращен из метода torch.full в примере, показанном выше.

Тензорные атрибуты

Каждый тензор ( torch.Tensor ) имеет атрибуты torch.dtype, torch.device и torch.layout.

  • torch.dtype:  torch.dtype — это объект, представляющий тип данных torch.Tensor. PyTorch имеет двенадцать различных типов данных.
  • torch.device: torch.device — это объект, представляющий устройство, на котором torch.Tensor находится или будет назначен. Torch.device содержит тип устройства ( «CPU» или «CUDA») и дополнительный порядковый номер устройства для типа устройства.

Пример:

torch.device('cuda:0')

Выход :

device(type='cuda', index=0)

Если порядковый номер устройства не указан, этот объект всегда будет представлять текущее устройство для данного типа устройства, даже после вызова torch.cuda.set_device ().

  • torch.layout: torch.layoutявляется объектом, который представляет собой распределение памяти в torch.Tensor. В настоящее время фонарик поддерживает два типа раскладки памяти.
  1. torch.strided:представляет собой плотные тензоры и является наиболее часто используемым макетом памяти. Каждый тензор stridden имеет связанный факел.в котором хранятся его данные. Эти тензоры обеспечивают многомерное, строгое представление хранилища. Шаг массива (также называемый приращением, шагом или размером шага) — это количество ячеек в памяти между началом последовательных элементов массива, измеренное в байтах или в единицах размера элементов массива. Шаг не может быть меньше размера элемента, но может быть больше, что указывает на дополнительное пространство между элементами. Итак, в основном здесь Strides — это список целых чисел: k-й шаг представляет собой скачок в памяти, необходимый для перехода от одного элемента к следующему в k-м измерении Tensor. Эта концепция позволяет эффективно выполнять множество тензорных операций.
Читайте также:  SRE или DevOps: в чем разница?

Давайте запустим несколько примеров фрагментов:

x = torch.Tensor([[1, 2, 3, 4], [5, 7, 8, 9]])
x.stride()

Выход:

(4,1)

2. torch.sparse_coo_tensor: используется для хранения массива в разреженном списке координат. В формате COO указанные элементы хранятся в виде кортежей индексов элементов и соответствующих значений.

i = [[, 1, 1],
     [2, , 2]]
 
v =  [3, 4, 5]
s = torch.sparse_coo_tensor(i, v, (2, 3))
Print(s)

Выход:

tensor(indices=tensor([[0, 1, 1],
                       [2, 0, 2]]),
       values=tensor([3, 4, 5]),
       size=(2, 3), nnz=3, layout=torch.sparse_coo)

Тензорные операции

Вы можете добавить два тензора, как сложение матриц.

x = torch.tensor([1., 2., 3.])
y = torch.tensor([4., 5., 6.])
z = x + y
print(z)

Выход:

tensor([5., 7., 9.])

torch.cat(): объединяет список тензоров

x_1 = torch.randn(2, 5)
y_1 = torch.randn(3, 5)
z_1 = torch.cat([x_1, y_1])
print(z_1)

Выход:

tensor([[ 0.5761,  0.6781,  0.1621,  0.4986,  0.3410],
        [-0.8428,  0.2510, -0.2668, -1.1475,  0.5675],
        [-0.2797, -0.0699,  2.8936,  1.8260,  2.1227],
        [ 1.3765, -0.0939, -0.3774, -0.3834,  0.0682],
        [ 2.3666,  0.0904,  0.7956,  1.2281,  0.5561]])

Чтобы объединить столбцы, вы можете сделать следующее.

x_2 = torch.randn(2, 3)
y_2 = torch.randn(2, 5)
 
# second argument specifies which axis to concat along
z_2 = torch.cat([x_2, y_2], 1)
print(z_2)

Выход:

tensor([[ 0.5818,  0.7047,  0.1581,  1.8658,  0.5953, -0.9453, -0.6395, -0.7106],
        [ 1.2197,  0.8110, -1.6072,  0.1463,  0.4895, -0.8226, -0.1889,  0.2668]])
  • view (): вы можете изменять форму тензоров с помощью метода.view (), как показано ниже.
    Python3
x = torch.randn(2, 3, 4)
print(x)
 
# reshape to 2 rows, 12 columns
print(x.view(2, 12))

Выход:

tensor([[[ 0.4321,  0.2414, -0.4776,  1.6408],
         [ 0.9085,  0.9195,  0.1321,  1.1891],
         [-0.9267, -0.1384,  0.0115, -0.4731]],

        [[ 0.7256,  0.6990, -1.7374,  0.6053],
         [ 0.0224, -1.2108,  0.1974,  0.0655],
         [-0.6182, -0.0797,  0.2603, -1.3280]]])
tensor([[ 0.4321,  0.2414, -0.4776,  1.6408,  0.9085,  0.9195,  0.1321,  1.1891,
         -0.9267, -0.1384,  0.0115, -0.4731],
        [ 0.7256,  0.6990, -1.7374,  0.6053,  0.0224, -1.2108,  0.1974,  0.0655,
         -0.6182, -0.0797,  0.2603, -1.3280]])
  • torch.argmax(): возвращает индекс максимального значения всех элементов во входном тензоре.
x = torch.randn(3,3)
print((x, torch.argmax(x)))

Выход:

(tensor([[ 1.9610, -0.7683, -2.6080],
        [-0.3659, -0.1731,  0.1061],
        [ 0.8582,  0.6420, -0.2380]]), tensor(0))

torch.argmin(): аналогично argmax (), он возвращает минимальное значение всех элементов во входном тензоре.

x = torch.randn(3,3)
print((x, torch.argmin(x)))

Выход:

(tensor([[ 0.9838, -1.2761,  0.2257],
        [-0.4754,  1.2677,  1.1973],
        [-1.2298, -0.5710, -1.3635]]), tensor(8))

Оцените статью
bestprogrammer.ru
Добавить комментарий