Тензоры в 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()
.