Тензор Pytorch и его использование — обязательно для новичков

Тензоры в PyTorch — это многомерные массивы, похожие на массивы NumPy. Подобно массивам NumPy, тензоры можно использовать для представления различных структур данных, таких как векторы, матрицы и изображения. Тензоры в PyTorch имеют следующие общие свойства:

  • shape: форма тензора, то есть размер каждого измерения.

  • dtype: тип данных тензора, например float32, , int64и т. д.

  • device: устройство, где хранятся тензоры, такие как cpuили cuda.

Тензоры в PyTorch поддерживают множество операций, таких как сложение и вычитание, умножение и деление, умножение матриц, индексирование, нарезка и многое другое. Тензор можно создать с помощью функции torch.Tensorили , например:torch.tensor

import torch

# 创建一个形状为(2, 3)的张量
x = torch.Tensor([[1, 2, 3], [4, 5, 6]])
print(x)
# 输出:
# tensor([[1., 2., 3.],
# [4., 5., 6.]])

# 创建一个全为0的形状为(3, 4)的张量
y = torch.zeros((3, 4))
print(y)
# 输出:
# tensor([[0., 0., 0., 0.],
# [0., 0., 0., 0.],
# [0., 0., 0., 0.]])

# 创建一个随机数的形状为(2, 2)的张量
z = torch.randn((2, 2))
print(z)
# 输出:
# tensor([[-1.7316, 0.5823],
# [-0.1171, -0.2952]])

# 创建一个与y形状相同的全为1的张量
ones = torch.ones_like(y)
print(ones)
# 输出:
# tensor([[1., 1., 1., 1.],
# [1., 1., 1., 1.],
# [1., 1., 1., 1.]])

Способ обхода тензоров в PyTorch аналогичен обходу списков Python, и вы можете использовать forциклы для обхода элементов в тензорах один за другим. Например:

import torch

# 创建一个形状为(2, 3)的张量
x = torch.Tensor([[1, 2, 3], [4, 5, 6]])

# 遍历张量中的元素
for i in range(x.shape[0]):
for j in range(x.shape[1]):
print(x[i, j])

Конечно, вы также можете использовать некоторые функции, предоставляемые PyTorch, для обхода тензоров, например, torch.flattenвы можете преобразовать многомерные тензоры в одномерные тензоры, а затем использовать forциклы для обхода элементов в тензорах. Например:

import torch

# 创建一个形状为(2, 3)的张量
x = torch.Tensor([[1, 2, 3], [4, 5, 6]])

# 将多维张量展开成一维张量
x_flat = torch.flatten(x) 

# 遍历该一维张量中的元素
for i in x_flat:
    print(i)

Другой пример выглядит следующим образом:

import torch

x = torch.tensor([[1, 2], [3, 4]])
x_flat = torch.flatten(x)

for i in x_flat:
    print(i)


В этом примере мы сначала создаем тензор 2 x 2 x, а затем используем torch.flatten()метод , чтобы сгладить его в одномерный тензор x_flat. Наконец, мы forперебираем x_flatвсе элементы тензора с помощью и печатаем их значения. Результат выглядит следующим образом:

tensor(1)
tensor(2)
tensor(3)
tensor(4)

Следует отметить, что при реальном использовании, если вы хотите работать с элементами в тензоре PyTorch, рекомендуется использовать векторизованные операции вместо forциклов Поскольку векторизованные операции могут использовать преимущества аппаратного ускорения, скорость работы выше.

В PyTorch многомерный тензор можно разложить в одномерный с помощью tensor.flatten()метода . Этот метод сгладит тензор до одного измерения и вернет новый тензор без изменения формы и данных исходного тензора. Вот простой пример:

import torch

# 创建一个 2 x 3 x 4 的三维张量
x = torch.randn(2, 3, 4)

# 将 x 展开成一维张量
y = x.flatten()

print("x shape:", x.shape) # 输出:x shape: torch.Size([2, 3, 4])
print("y shape:", y.shape) # 输出:y shape: torch.Size([24])

В приведенном выше коде мы сначала создаем трехмерный тензор формы (2, 3, 4), xа затем расширяем его до одномерного тензора с помощью flatten()метода y. Наконец, формы исходного тензора xи y. Можно видеть, что yформа равна (24,), что является числом всех элементов в исходном тензоре.

torch.flatten()Это один из методов PyTorch для преобразования многомерных тензоров в одномерные. Вы можете использовать его, чтобы развернуть тензор в одномерный тензор. Вот простой пример:

import torch

x = torch.tensor([[1, 2], [3, 4]])

x_flat = torch.flatten(x)

print(x)  # tensor([[1, 2],

          #         [3, 4]])

print(x_flat)  # tensor([1, 2, 3, 4])

В этом примере мы сначала создаем тензор 2 x 2 x, а затем используем torch.flatten()метод , чтобы сгладить его в одномерный тензор x_flat. Расширенный тензор x_flatсодержит все элементы исходного тензора, и эти элементы расположены в порядке исходного тензора.

Вот пример простой операции векторизации тензора PyTorch:

import torch

# 创建一个 2x3 的张量
a = torch.tensor([[1, 2, 3], [4, 5, 6]])

# 创建一个 3x2 的张量
b = torch.tensor([[1, 2], [3, 4], [5, 6]])

# 张量相乘
c = torch.matmul(a, b)

print(c)

В этом примере мы сначала создаем два тензора aи bматрицы 2x3 и 3x2 соответственно. Затем используйте torch.matmulфункцию чтобы умножить две матрицы и присвоить результат переменной c. Наконец, распечатайте cзначение .

Следует отметить, что векторизованные операции обычно быстрее, чем forциклические , поэтому старайтесь использовать векторизованные операции в реальных условиях. Кроме того, PyTorch также предоставляет множество других векторизованных операций, таких как тензорное сложение, вычитание, умножение, деление и другие операции, а также различные часто используемые математические функции (такие как, и т. д.), которые пользователи могут выбирать и использовать в соответствии с фактическими torch.exp()потребности torch.log().

Ниже приведен простой пример, показывающий, как использовать PyTorch для выполнения двух операций тензорной векторизации, найти разницу, а затем суммировать и усреднять столбцы по отдельности.

import torch

# 创建两个 3x4 的张量
a = torch.tensor([[1.0, 2.0, 3.0, 4.0], [5.0, 6.0, 7.0, 8.0], [9.0, 10.0, 11.0, 12.0]])
b = torch.tensor([[2.0, 3.0, 4.0, 5.0], [6.0, 7.0, 8.0, 9.0], [10.0, 11.0, 12.0, 13.0]])

# 两个张量相减
diff = a - b

# 分别求各列的和
col_sum = torch.sum(diff, dim=0)

# 求平均值
col_avg = torch.mean(col_sum)

print(col_avg)

В этом примере мы сначала создаем два тензора 3x4 a, а bзатем вычитаем их, чтобы получить новый тензор diff. Затем используйте torch.sumфункцию diffдля суммирования вдоль направления столбца, чтобы получить тензор длины 4 col_sum, где каждый элемент представляет собой сумму разности соответствующего столбца. Наконец, используйте torch.meanфункцию, col_sumдля усреднения и получения скаляра col_avg, представляющего среднее значение суммы разностей каждого столбца. Наконец, распечатайте col_avgзначение .

Следует отметить, что векторизованные операции обычно быстрее, чем forциклические , поэтому старайтесь использовать векторизованные операции в реальных условиях. Кроме того, PyTorch также предоставляет множество других векторизованных операций, таких как тензорное сложение, вычитание, умножение, деление и другие операции, а также различные часто используемые математические функции (такие как, и т. д.), которые пользователи могут выбирать и использовать в соответствии с фактическими torch.exp()потребности torch.log().

Guess you like

Origin blog.csdn.net/Fan0920/article/details/130083359