29 сниппетов Pytorch для ускорения цикла машинного обучения

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

1. Вывод версии Pytorch

import torch
print(torch.version.__version__)

# Вывод

1.7.1

2. Создание тензора (многомерного массива данных) из вложенного списка ndarray

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

# Вывод

tensor([1, 2, 3])

3. Клонирование тензора

y = x.clone()
print(y)

# Вывод

tensor([1, 2, 3])

4. Получение размера и форм

x = torch.randn((10,10))
print(x.size())
# или
print(x.shape)

# Вывод

torch.Size([10, 10])
torch.Size([10, 10])

5. Конкатенация тензоров по размерности

tensor_seq = [torch.randn(1,2),torch.randn(1,2)]
x = torch.cat(tensor_seq, dim=0)
print(x)

# Вывод

tensor([[-0.4298,  1.3190],
        [ 0.3904, -1.4962]])

6. Преобразование формы тензора в размер: (1, любое значение)

x = torch.randn(10,2)
y = x.view(1,-1)
print(y.shape)

# Вывод

torch.Size([1, 20])

7. Изменение размерности тензора

x = torch.randn(1,2)
print(x)
y = x.transpose(0,1)
print(y)

# Вывод

tensor([[-0.3085,  0.9356]])

tensor([[-0.3085],
        [ 0.9356]])

8. Добавление тензору оси

x = torch.randn(2,2)
print(x.shape)
y = x.unsqueeze(dim=0)                      
print(y.shape)

# Вывод

torch.Size([2, 2])
torch.Size([1, 2, 2])

9. Удаление всех единичных размерностей

x = torch.randn(10,10,1)
print(x.shape)
y = x.squeeze()
print(y.shape)
# Вывод
torch.Size([10, 10, 1])
torch.Size([10, 10])

10. Перемножение матриц

A = torch.ones(2,2)
B = torch.randn(2,2)
print(A)
print(B)
print(A.mm(B))

# Вывод

tensor([[1., 1.],
        [1., 1.]])
tensor([[ 0.5804,  1.2500],
        [-0.8334,  1.1711]])

tensor([[-0.2530,  2.4212],
        [-0.2530,  2.4212]])

11. Умножение матрицы на вектор

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

# Вывод

tensor([ 7, 10])

12. Транспонирование матрицы

x = torch.randn(1,2)
print(x)
x = x.t()
print(x)

tensor([[0.1167, 0.4135]])

tensor([[0.1167],
        [0.4135]])

13. Проверка доступности cuda

print(torch.cuda.is_available())

# Вывод

True

14. Перемещение данных тензора из центрального процессора в графический и возвращение нового объекта

x = torch.randn(2,2)
print(x)
x = x.cuda()
print(x)

# Вывод

tensor([[-1.0331, -3.2458],
        [ 0.0226,  1.3091]])

tensor([[-1.0331, -3.2458],
        [ 0.0226,  1.3091]], device='cuda:0')

15. Перемещение данных тензора из графического процессора в центральный

x = torch.randn(2,2).cuda()
print(x)
x = x.cpu()
print(x)

# Вывод

tensor([[ 0.4664, -1.7070],
        [ 1.7160,  0.0263]], device='cuda:0')

tensor([[ 0.4664, -1.7070],
        [ 1.7160,  0.0263]])

16. Устройство-независимый код и модульность

device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
print(device)

# Вывод

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

17. Копирование тензоров на устройство (графический процессор, центральный процессор)

x = x.to(device)
print(x)

# Вывод

tensor([[ 0.4664, -1.7070],
        [ 1.7160,  0.0263]], device='cuda:0')

18. Проверка тензора Pytorch

print(torch.is_storage(x))

# Вывод

True

19. Проверка объекта хранилища Pytorch

print(torch.is_storage(x))

# Вывод

False

20. Получение общего числа элементов во входном тензоре

x = torch.randn(2,2) # 4 элемента
torch.numel(x)

# Вывод

4

21. Получение единичной матрицы для заданного размера

size = 5
print(torch.eye(size))

# Вывод

tensor([[1., 0., 0., 0., 0.],
        [0., 1., 0., 0., 0.],
        [0., 0., 1., 0., 0.],
        [0., 0., 0., 1., 0.],
        [0., 0., 0., 0., 1.]])

22. Преобразование из массива numpy в тензор torch

x = np.random.rand(2,2)
print(torch.from_numpy(x))

# Вывод

tensor([[0.7407, 0.8823],
        [0.0352, 0.5823]], dtype=torch.float64)

23. Создание тензора из равномерно распределенных элементов (как np.linspace в numpy)

print(np.linspace(1,5,10))
print(torch.linspace(1, 5, steps=10))

# Вывод

[1.         1.44444444 1.88888889 2.33333333 2.77777778 3.22222222
 3.66666667 4.11111111 4.55555556 5.        ] # numpy

tensor([1.0000, 1.4444, 1.8889, 2.3333, 2.7778, 3.2222, 3.6667, 4.1111, 4.5556,
        5.0000]) # pytorch

24. Создание тензора из логарифмически распределенных элементов

torch.logspace(start=-10, end=10, steps=15) #logarithmic spacing

# Вывод

tensor([1.0000e-10, 2.6827e-09, 7.1969e-08, 1.9307e-06, 5.1795e-05, 1.3895e-03,
        3.7276e-02, 1.0000e+00, 2.6827e+01, 7.1969e+02, 1.9307e+04, 5.1795e+05,
        1.3895e+07, 3.7276e+08, 1.0000e+10])

25. Разбиение тензора Pytorch на небольшие фрагменты

x = torch.linspace(1,10,10)
print(torch.chunk(x,chunks=5))

# Вывод

(tensor([1., 2.]),
 tensor([3., 4.]),
 tensor([5., 6.]),
 tensor([7., 8.]),
 tensor([ 9., 10.]))

26. Создание базовой нейросети

import torch
import torch.nn as nn
import torch

class NeuralNet(nn.Module):
    def __init__(self):
        super(NeuralNet, self).__init__()
        self.fc1 = nn.Linear(1,1)
        self.relu = nn.ReLU()
        
    
    def forward(self,x):
        x = self.fc1(x)
        x = self.relu(x)
        
        return x
net = NeuralNet()
net

# Вывод

NeuralNet(
  (fc1): Linear(in_features=1, out_features=1, bias=True)
  (relu): ReLU()
)

27. Создание тензоров входных и выходных данных для обучения нейросети

x = torch.linspace(-10, 10, 2000).view(-1,1)
y = torch.square(x)

28. Загрузка нейросети, настройка функции потерь и оптимизатора

model = NeuralNet()
criterion = torch.nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(), lr=1e-6)

29. Цикл обучения, дающий выходные данные каждые 10 эпох

epochs = 50
for t in range(epochs):
    # Прямой проход: вычисление предсказания
    y_pred = model(x)

    # Вычисление потерь и вывод через каждые 10 итераций
    loss = criterion(y_pred, y)
    if t % 10 == 9:
        print(t, loss.item())

    # Нулевые градиенты, выполнение обратного прохода и обновление весов.
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

# Вывод

9 1987.289306640625
19 1986.6630859375
29 1986.0374755859375
39 1985.412353515625
49 1984.78759765625

Подведем итоги

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

Обращу ваше внимание на два полезных источника, которые отлично подходят для базового кода в Pytorch: 1 и 2.

Далеко эти фрагменты кода Pytorch не убирайте (они вам обязательно понадобятся) и пишите код с удовольствием! Спасибо за внимание. 🙂

Читайте также:

Читайте нас в Telegram, VK и Яндекс.Дзен


Перевод статьи Lucas Soares: 29 Pytorch Snippets to Speed Up Your Machine Learning Cycle

Предыдущая статья3 функции Pandas для группировки и агрегирования данных
Следующая статьяЧем отличается разработка продукта для ИИ