Вход и улучшение Pytorch (1) - создание Tensor

искусственный интеллект PyTorch
Вход и улучшение Pytorch (1) - создание Tensor

Это седьмой день моего участия в августовском испытании обновлений, подробности о мероприятии:Испытание августовского обновления

Теперь оформление заголовка статьи является ключевым шагом к тому, будет ли статья читать больше.Я долго думал об этом, и все переворачивал.Наконец, я использовал простенький заголовок-запись и улучшение Pytorch (1), но Я надеюсь, что мы сможем поделиться контентом для вас.

Внедрение зависимостей.В дополнение к сегодняшнему главному герою мы также вводим numpy

import numpy as np
import torch

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

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

Создать тензор очень просто, мы напрямую вводим данные вtorch.tensorСоздается тип данных Tensor.

Создать тензор на основе numpy и списка

Есть много способов создать тензор, давайте сначала представим создание тензора на основе существующих типов коллекций numpy и list.

Создать тензор с помощью numpy

В проектах на Python numpy можно увидеть повсюду, а numpy можно использовать как в машинном обучении, так и в анализе данных и проектах майнинга. Поэтому популярные фреймворки глубокого обучения, такие как tensorflow и pytorch, поддерживают numpy.

a = np.array([1,1.2])

Используйте torch.from_numpy для преобразования типа ndarray numpy в тип тензора pytorch и сохраните тип float64.

a_tensor = torch.from_numpy(a)
a_tensor
tensor([1.0000, 1.2000])

Создать тензор из списка

В дополнение к созданию тензоров из ndarray numpy выше, pytorch также поддерживает создание тензоров из списков.

a_list = [1,1.2]
a_tensor = torch.tensor(a_list)
a_tensor
tensor([1.0000, 1.2000])
b_tensor = torch.FloatTensor(a_list)
b_tensor
tensor([1.0000, 1.2000], dtype=torch.float32)

Обратите внимание, что torch.tensor используется для создания тензоров.Есть также заглавная стартовая torch.Tensor в torch.У них разные цели, то есть они получают разные параметры для создания тензоров.Тензоры, начинающиеся с нижнего регистра, получают список или объекты numpy в качестве параметров для создания тензоров, в то время как в дополнение к начальной капитализации он также получает представление размера для создания тензора со случайно инициализированными данными.

a_empty = torch.empty(2,3)
a_empty
tensor([[-2.3158e+77, -2.3158e+77, 5.9288e-323],
        [ 0.0000e+00, 2.1220e-314, 2.9805e+179]])
a_tensor = torch.FloatTensor(2,3,3,3)
a_tensor

    tensor([[[[ 2.4174e-06,  2.1780e-04,  1.2914e-11],
              [ 1.6691e+22,  2.6705e+23,  8.2662e-10],
              [ 2.7300e-06,  8.1714e+20,  3.2944e-09]],
    
             [[ 4.2248e-05,  2.3328e-18,  1.6678e+19],
              [ 7.0976e+22,  1.2853e+31,  3.0979e+32],
              [ 2.3329e-18,  4.5447e+30,  7.0062e+22]],
    
             [[ 2.1058e+35,  2.6447e+20,  6.4825e-10],
              [ 1.2849e+31,  1.8395e+25,  6.1963e-04],
              [ 2.0662e+20,  8.1936e-10,  2.1344e-07]]],


​    
            [[[ 1.3236e-08,  4.3964e-05,  6.7498e-07],
              [ 6.6288e-10,  1.3679e+22,  2.3049e-12],
              [ 7.1429e+31,  2.5226e-18,  6.4825e-10]],
    
             [[ 1.0015e-11,  1.2352e-08,  2.6707e-06],
              [ 4.0518e-11,  2.6079e-09,  2.9572e-18],
              [ 7.2646e+22,  7.2250e+28,  2.5226e-18]],
    
             [[ 2.4283e-18,  1.7516e-43,  0.0000e+00],
              [ 0.0000e+00, -8.5899e+09,  1.8190e-27],
              [-3.6902e+19,  1.2612e-44, -8.5899e+09]]]], dtype=torch.float32)

Используйте empty или FloatTensor для создания неинициализированного тензора, На самом деле в тензоре также есть случайно заданные значения, но эти значения слишком велики или слишком малы.

установить тип по умолчанию

Если мы создадим тенор без указания типа данных, система будет использовать тип данных по умолчанию torch.FloatTensor.

a = torch.tensor([1,]).type()
a

Чтобы установить тип по умолчанию, вы можете установить тип данных тензора по умолчанию через set_default_tensor_type.

torch.set_default_tensor_type(torch.DoubleTensor)
a = torch.tensor([1.2,2.1]).type()
a
'torch.DoubleTensor'

Случайным образом создайте тензор, используя метод rand

Вы можете вызвать метод rand для создания тензора. Тензор, созданный rand, инициализируется некоторыми случайными числами. Метод rand получает параметр, который определяет форму тензора. Следующее создает2×32 \times 3тензор.

torch.rand(2,3)
tensor([[0.4056, 0.9493, 0.2661],
        [0.2156, 0.4715, 0.4217]])

Создайте тензор, используя метод rand_like

Разница между rand_like и rand заключается в том, что rand_like принимает тензор в качестве параметра, и тензор, созданный rand_like, будет иметь ту же форму, что и входной тензор.

a = torch.tensor([[2.,3.,4.],[1.,2.,3.]])
res = torch.rand_like(a)
print(res.shape)
torch.Size([2, 3])

Обычно, чтобы создать тензор, нам всем нужно посмотреть на форму тензора.

Инициализировать тензор случайными числами

randint используется для создания тензора целочисленных случайных чисел.

# [min,max)
torch.randint(1,10,(2,3))
  • Значение по умолчанию первого параметра (low) равно 0, что определяет начальное значение случайного числа, выбранного случайным образом из определенного диапазона.
  • Конечное значение диапазона второго параметра (высокое)
  • Третий параметр (размер) создает форму тензора

    tensor([[6, 1, 9],
            [1, 2, 8]])
# 正态分布,randn 表示均值为 0 方差为 1 的正态分布
torch.randn(3,3)
tensor([[ 0.7808,  0.9283, -0.3443],
        [-0.6449,  0.7878, -0.2888],
        [-0.5749,  0.0562,  2.5841]])
# normal 函数提供自定义均值和方差来创建 tensor,例如我们想要创建 2 * 5 的正态分布,先创建 10 数,然后创建 10 均值,再创建 10 个方差
a = torch.normal(mean=torch.full([10],0.),std=torch.arange(1,0,-0.1))
# full 函数创建 10 为 0 的 Tensor
a
tensor([-0.7043,  2.0245, -0.3698,  0.3927,  0.0138, -0.2230, -0.8763,  0.0090,
         0.2446,  0.0955])
torch.normal(mean=0.5, std=torch.arange(1., 6.))
tensor([ 1.0381, -1.3676, -5.2665,  5.1679, -8.0477])

нормальный метод создания Tensor

Используйте нормальный для создания тензора, содержащего значения из заданных параметровmeans,stdСлучайные числа взяты из дискретного нормального распределения . значитmeansпредставляет собой тензор, содержащий среднее значение нормального распределения, связанного с каждым выходным элементом. stdпредставляет собой тензор, содержащий стандартное отклонение нормального распределения, связанное с каждым выходным элементом. Формы среднего и стандартного отклонения не обязательно должны совпадать, но каждый тензор должен иметь одинаковое количество элементов.

torch.normal(mean=torch.arange(1., 11.), std=torch.arange(1, 0, -0.1))
tensor([0.6371, 3.1117, 3.2735, 3.7251, 3.8135, 5.7626, 7.0770, 8.1662, 9.1001,
        9.9700])
tensor_full_a = torch.full((2,3),7.)
tensor_full_a
tensor([[7., 7., 7.],
        [7., 7., 7.]])
torch.full((2, 3), 3.141592)
tensor([[3.1416, 3.1416, 3.1416],
        [3.1416, 3.1416, 3.1416]])
# 使用 reshape 对形状进行变换
a = a.reshape(2,5)
a
tensor([[-0.7043,  2.0245, -0.3698,  0.3927,  0.0138],
        [-0.2230, -0.8763,  0.0090,  0.2446,  0.0955]])

метод linspace для создания Tensor

torch.linspace(0,10,steps=4)

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

tensor([ 0.0000,  3.3333,  6.6667, 10.0000])
torch.logspace(0,-1,steps=10)
tensor([1.0000, 0.7743, 0.5995, 0.4642, 0.3594, 0.2783, 0.2154, 0.1668, 0.1292,
        0.1000])

Новый тензор также можно получить, изменив его форму на тензор.

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

Полный метод создает тензор

Полный метод принимает два параметра, один параметр используется для указания формы созданного тензора, а второй параметр — это значение, которым заполняется тензор.

# a.reshape(3,2)
torch.full([2,3],7.)
tensor([[7., 7., 7.],
        [7., 7., 7.]])
# 创建一个标量
torch.full([],7)
tensor(7.)
# 创建一个向量
torch.full([1],7)
tensor([7.])

Метод arange создает тензор

arange создает тензор для получения интервала, принцип интервала соответствует принципу закрытия слева и открытия справа, [)

torch.arange(0,10)
tensor([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
# 第三个参数表示步进
torch.arange(0,10,2)
tensor([0, 2, 4, 6, 8])

Разделить метод для создания тензора

linspace предназначен для равного деления в указанном интервале, например, steps делит интервал на шаги поровну.

torch.linspace(0,10,steps=4)
tensor([ 0.0000,  3.3333,  6.6667, 10.0000])
torch.linspace(0,10,steps=10)
tensor([ 0.0000,  1.1111,  2.2222,  3.3333,  4.4444,  5.5556,  6.6667,  7.7778,
         8.8889, 10.0000])
torch.linspace(0,10,steps=11)
tensor([ 0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10.])
torch.logspace(0,-1,steps=10)
tensor([1.0000, 0.7743, 0.5995, 0.4642, 0.3594, 0.2783, 0.2154, 0.1668, 0.1292,
        0.1000])
torch.logspace(0,1,steps=10)
tensor([ 1.0000,  1.2915,  1.6681,  2.1544,  2.7826,  3.5938,  4.6416,  5.9948,
         7.7426, 10.0000])

Другие способы создания тензора

  • Метод единиц создает тензор со всеми единицами, а единицы получают параметр для указания формы тензора.
  • Метод нулей создает тензор со всеми нулями, а единицы получают параметры для указания формы тензора.
  • Метод глаза создает тензор, все диагонали которого равны 1, а все остальные позиции равны 0, и они получают параметры для указания формы тензора.

torch.ones(3,3)
tensor([[1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.]])
torch.zeros(3,3)
tensor([[0., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.]])
torch.eye(3,2)
tensor([[1., 0.],
        [0., 1.],
        [0., 0.]])
torch.eye(3)
tensor([[1., 0., 0.],
        [0., 1., 0.],
        [0., 0., 1.]])
a = torch.zeros(3,3)
torch.ones_like(a)
tensor([[1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.]])
# 随机打散 [0,10)
torch.randperm(10)
tensor([1, 3, 0, 2, 9, 5, 6, 7, 4, 8])
a = torch.rand(2,3)
b = torch.rand(2,2)
idx = torch.randperm(2)
idx
tensor([0, 1])
a[idx]
tensor([[0.9753, 0.6958, 0.7198],
        [0.9417, 0.3410, 0.9740]])
b[idx]
tensor([[0.0652, 0.7491],
        [0.9848, 0.7652]])