Узнайте о Pytorch за 10 минут

машинное обучение

Что такое Питорч?

  1. Вы можете использовать Pytorch в качестве альтернативы Numpy, выполнять научные вычисления и быть более мощным.
  2. Моделирование моделей, обучение, развертывание и т. д. для задач ИИ. Единственный, кто может конкурировать с ним в этом отношении, — Tensorflow от Google.

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

  1. Создание и работа Tensor, cuda ускоряет расчет.
  2. Функция автоматического дифференцирования Pytorch.

Создание тензора и манипулирование им

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

  1. Создайте неинициализированный пустой тензор формы (5,3).

входить:

x = torch.empty(5, 3)
print(x)

вывод:

tensor([[1.0102e-38, 9.0919e-39, 1.0102e-38],
        [8.9082e-39, 8.4489e-39, 9.6429e-39],
        [8.4490e-39, 9.6429e-39, 9.2755e-39],
        [1.0286e-38, 9.0919e-39, 8.9082e-39],
        [9.2755e-39, 8.4490e-39, 1.0194e-38]])


  1. Создайте случайно инициализированный тензор формы (5,3).

входить:

x = torch.rand(5, 3)
print(x)

вывод:

tensor([[0.4133, 0.0885, 0.0503],
        [0.6771, 0.5543, 0.8236],
        [0.3047, 0.1217, 0.4441],
        [0.6269, 0.6820, 0.4217],
        [0.5631, 0.8517, 0.8708]])


  1. Создайте 0-дополненный тензор формы (5,3).

входить:

x = torch.zeros(5, 3, dtype=torch.long)
print(x)

вывод:

tensor([[0, 0, 0],
        [0, 0, 0],
        [0, 0, 0],
        [0, 0, 0],
        [0, 0, 0]])


Создайте тензор прямо из списка:

x = torch.tensor([5.5, 3])
print(x)

вывод:

tensor([5.5000, 3.0000])

Создайте новый тензор на основе существующего тензора.По умолчанию новый тензор наследует атрибуты существующего тензора, такие как форма, тип данных и т. д. Конечно, это также можно указать вручную. :

x = x.new_ones(5, 3, dtype=torch.double)
print(x)

вывод:

tensor([[1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.]], dtype=torch.float64)

Создайте случайный тензор той же формы, что и существующий тензор, и переопределите тип данныхtorch.float:

x = torch.randn_like(x, dtype=torch.float)
print(x)

вывод:

tensor([[ 0.9629,  0.0349,  0.5597],
        [-2.1172,  1.1874, -0.1596],
        [ 0.6841, -0.6172, -0.4732],
        [ 0.0468, -0.3634,  1.1014],
        [ 0.6064,  0.1740,  0.2344]])

  1. Посмотреть форму тензора

входить:

print(x.size())

вывод:

torch.Size([5, 3])

tensor.sizeМетод возвращает объект кортежа, который может выполнять различные операции над кортежем.

Основные операции тензора

Для получения подробной информации см.официальная документация

1. Создать

  • Классы torch.rand* генерируют случайные тензорные методы.
torch.rand()
torch.rand_like()
torch.randn()
torch.randn_like()
torch.randint()
torch.randint_like()
torch.randperm()
torch.empty()
  • Создано из других источников данных
torch.tensor()
torch.from_numpy()
torch.full()
torch.range()
torch.linspace()
torch.eye()

2. Преобразования, такие как индексация, нарезка, слияние и т. д.

# 按指定维度拼接 tensor
torch.cat() 

# 按指定维度将一个 tensor 分割为几个小块
torch.chunk()

# 按照深度方向(第三维)将多个 tensor 拼接,若tensor不足三维,则先转为3维 tensor 再行拼接。
torch.dstack()

# 将多个 tensor 按第1维进行拼接
torch.hstack()

# 按指定维度进行索引查询
torch.index_select()

# 根据一个 BoolTensor 进行 mask 查询
torch.masked_select()

# 调换 tensor 维度
torch.movedim()

# 返回 tensor 中非0值的索引
torch.nonzero()

# 改变 tensor 形状
torch.reshape()

# 按照指定维度及指定大小将 tensor 分割为几块
torch.split()

# 去除所有 tensor 中大小为1的维度,也可以指定哪个维度。
torch.squeeze()

# 按照指定维度拼接多个 tensor
torch.stack()

# tensor 转置
torch.t()

# 根据给定的索引从已有 tensor 中抽取出一个新的 tensor。
torch.take()

# 将 tensor 的指定两个维度进行互换
torch.transpose()

# 在指定地方增加 tensor 维度
torch.unsqueeze()

# 类似 dstack,只是是在第二个维度进行拼接
torch.vstack()

# 对 tensor 中每个元素根据条件判断如何返回
torch.where()

3. Настройки параметров машины случайного отбора проб

# 设置非确定性随机数的随机种子
torch.seed

# 设置生成随机数的随机种子
torch.manual_seed

# 查看初始化的随机种子,为 `long` 类型
torch.initial_seed

# 查看随机数生成器状态
torch.get_rng_state

# 设置随机数生成器状态
torch.set_rng_state

4. Сериализация и десериализация

# 对 Pytorch 中的对象进行序列化保存和读取
torch.save()
torch.load()

5. Параллельные вычисления

# 获取和设置 CPU 并行操作时的线程数
torch.get_num_threads
torch.set_num_threads

# 获取和设置 CPU 上的互操作并行的线程数
torch.get_num_interop_threads
torch.set_num_interop_threads

6. Градиентный контроль

Существует несколько способов контролировать, вычисляет ли тензор градиенты.

входить:

x = torch.zeros(1, requires_grad=True)
with torch.no_grad():
    y = x * 2
print(y.requires_grad)


is_train = False
with torch.set_grad_enabled(is_train):
    y = x * 2
print(y.requires_grad)


torch.set_grad_enabled(True)
y = x * 2
print(y.requires_grad)

вывод:

False
False
True

7. Математические операции

pytorch поддерживает наиболее распространенные математические операции, которые здесь подробно не перечислены.официальная документация

# Pointwise 操作
torch.abs
torch.clip
torch.cos
torch.sin
torch.div
torch.exp
torch.pow
torch.log
torch.sigmoid

# Reduction 操作
torch.argmax
torch.argmin
torch.max
torch.dist
torch.mean
torch.norm
torch.count_nonzero

# 比较操作
torch.allclose
torch.argsort
torch.eq
torch.equal
torch.ge
torch.gt
torch.isinf
torch.isfinite
torch.isnan
torch.isreal
torch.isneginf
torch.sort
torch.topk

# 光谱操作及其他操作
......


Автоматическое дифференцирование в Pytorch

Pytorch имеет возможности автоматической дифференциации.

  1. requires_grad

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

x = torch.ones(2, 2, requires_grad=True)
print(x)

вывод:

tensor([[1., 1.],
        [1., 1.]], requires_grad=True)

  1. grad_fn

Относится к тому, какой функцией получен текущий тензор, и будет рассчитываться в соответствии с этой функцией во время вывода цепочки. Вообще говоря, в дополнение к тензору, созданному пользователем, если тензор, сгенерированный встроенной функцией pytorch, будет иметь grad_fn.

входить:

y = x + 2
print(y)
print(y.grad_fn)

z = y * y * 3
out = z.mean()
print(z, out)

вывод:

tensor([[3., 3.],
        [3., 3.]], grad_fn=<AddBackward0>)
<AddBackward0 object at 0x000001CEE32753C8>
tensor([[27., 27.],
        [27., 27.]], grad_fn=<MulBackward0>) tensor(27., grad_fn=<MeanBackward0>)

  1. backward & grad

Для вычисления градиента используется обратный метод, а градиент, рассчитанный по правилу вывода цепочки, сохраняется в атрибуте grad тензора.

входить:

out.backward()
print(x.grad)

вывод:

tensor([[4.5000, 4.5000],
        [4.5000, 4.5000]])

  1. with torch.no_grad

Таким образом можно избежать вычисления градиента при расчете.

входить:

print(x.requires_grad)
print((x ** 2).requires_grad)
with torch.no_grad():
    print((x ** 2).requires_grad)

вывод:

True
True
False

  1. detach

Избегайте вычисления градиента с помощью метода отсоединения

входить:

print(x.requires_grad)
y = x.detach()
print(y.requires_grad)
print(x.eq(y).all())

вывод:

True
False
tensor(True)

  1. requires_grad_

настраиватьrequires_grad_Свойства для прямого изменения конфигурации расчета тензорного градиента.

входить:

a = torch.randn(2, 2)
a = ((a * 3) / (a - 1))
print(a.requires_grad)
a.requires_grad_(True)
print(a.requires_grad)
b = (a * a).sum()
print(b.grad_fn)

вывод:

False
True
<SumBackward0 object at 0x000001CEE32753C8>


Заканчивать

В этой статье описаны основные методы создания и основные операции тензора в Pytorch, а также представлен механизм автоматического дифференцирования Pytorch. Это легкое начало.

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

Ссылаться на

  1. py torch.org/tutorials/ нет…
  2. py torch.org/docs/stable…
  3. py torch.org/tutorials/ нет…

Отсканируйте код и продолжайте обращать внимание на публичный номер~

我的公众号