Версия Python¶

In [1]:
!python -V
Python 3.12.6

Импорт необходимых библиотек¶

In [2]:
# Подавление предупреждений
import warnings
for warn in [UserWarning, FutureWarning]: warnings.filterwarnings("ignore", category = warn)

import os
import numpy as np
import torch
import torch.nn as nn
import pandas as pd
import jupyterlab as jlab

from dataclasses import dataclass

Версии необходимых библиотек¶

In [3]:
packages = [
    "Torch", "NumPy", "Pandas", "JupyterLab",
]

package_objects = [
    torch, np, pd, jlab
]

versions = list(map(lambda obj: obj.__version__, package_objects))

pkgs = {"Библиотека": packages, "Версия": versions}
df_pkgs = pd.DataFrame(data = pkgs)
df_pkgs.index.name = "№"
df_pkgs.index += 1

display(df_pkgs)

path_to_reqs = "."
reqs_name = "requirements.txt"

def get_packages_and_versions():
    """Генерация строк с библиотеками и их версиями в формате: библиотека==версия"""
    
    for package, version in zip(packages, versions):
        yield f"{package.lower()}=={version}\n"

with open(os.path.join(path_to_reqs, reqs_name), "w", encoding = "utf-8") as f:
    f.writelines(get_packages_and_versions())
Библиотека Версия
№
1 Torch 2.2.2
2 NumPy 1.26.4
3 Pandas 2.2.3
4 JupyterLab 4.2.5

L1Loss (L1-норма или средняя абсолютная ошибка)¶

Регрессия

Измерение средней абсолютной разницы между предсказанными и истинными значениями нейросетевой модели.

In [4]:
# Создание объекта L1Loss
loss = nn.L1Loss(reduction = "mean") # none | mean | sum

# Генерация входных данных и целевых меток
input = torch.tensor([[0.5, -0.3, 1.2], [0.0, -1.5, 2.1]], requires_grad = True) # torch.randn(2, 3)
target = torch.tensor([[0.0, 0.0, 1.0], [0.0, 1.0, -1.0]]) # torch.randn(2, 3)

# Вычисление функции потерь
output = loss(input, target)

print("Средняя абсолютная разница:", output.item())

# Выполнение обратного прохода (backpropagation)
output.backward()

print("Градиенты по входным данным:", input.grad)
Средняя абсолютная разница: 1.100000023841858
Градиенты по входным данным: tensor([[ 0.1667, -0.1667,  0.1667],
        [ 0.0000, -0.1667,  0.1667]])

MSELoss (Mean Squared Error Loss)¶

Регрессия

Измерение среднеквадратичной ошибки между предсказанными и истинными значениями нейросетевой модели.

In [5]:
# Создание объекта MSELoss
loss = nn.MSELoss(reduction = "mean") # none | mean | sum

# Генерация входных данных и целевых меток
input = torch.tensor([[0.5, -0.3, 1.2], [0.0, -1.5, 2.1]], requires_grad = True) # torch.randn(2, 3)
target = torch.tensor([[0.0, 0.0, 1.0], [0.0, 1.0, -1.0]]) # torch.randn(2, 3)

# Вычисление функции потерь
output = loss(input, target)

# Вывод значения функции потерь
print("Среднеквадратичная ошибка:", output.item())

# Выполнение обратного прохода (backpropagation)
output.backward()

print("Градиенты по входным данным:", input.grad)
Среднеквадратичная ошибка: 2.706666946411133
Градиенты по входным данным: tensor([[ 0.1667, -0.1000,  0.0667],
        [ 0.0000, -0.8333,  1.0333]])

PoissonNLLLoss¶

Регрессия

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

In [6]:
# Создание объекта PoissonNLLLoss
loss = nn.PoissonNLLLoss(log_input = True, full = False, eps = 1e-8, reduction = "mean")

# Генерация входных данных и целевых меток
input = torch.tensor([[0.5, -0.3, 1.2], [0.0, -1.5, 2.1]], requires_grad = True) # torch.randn(2, 3)
target = torch.tensor([[0.0, 0.0, 1.0], [0.0, 1.0, -1.0]]) # torch.randn(2, 3)

# Вычисление функции потерь
output = loss(input, target)

# Вывод значения функции потерь
print("Значение функции потерь:", output.item())

# Выполнение обратного прохода (backpropagation)
output.backward()

print("Градиенты по входным данным:", input.grad)
Значение функции потерь: 2.916492462158203
Градиенты по входным данным: tensor([[ 0.2748,  0.1235,  0.3867],
        [ 0.1667, -0.1295,  1.5277]])

GaussianNLLLoss¶

Регрессия

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

In [7]:
# Создание объекта GaussianNLLLoss
loss = nn.GaussianNLLLoss(full = False, eps = 1e-6, reduction = "mean")

# Генерация входных данных и целевых меток
input = torch.tensor([[2.5, 0.0], [0.0, 1.0], [1.0, 2.0]], requires_grad = True)
target = torch.tensor([[3.0, 0.0], [0.0, 2.0], [1.0, 2.0]])
var = torch.tensor([[0.5, 0.2], [0.1, 0.3], [0.2, 0.3]])

# Вычисление функции потерь
output = loss(input, target, var)

# Вывод значения функции потерь
print("Значение функции потерь:", output.item())

# Выполнение обратного прохода (backpropagation)
output.backward()

print("Градиенты по входным данным:", input.grad)
Значение функции потерь: -0.39910173416137695
Градиенты по входным данным: tensor([[-0.1667,  0.0000],
        [ 0.0000, -0.5556],
        [ 0.0000,  0.0000]])

KLDivLoss (Kullback-Leibler Divergence Loss)¶

Регрессия

Измерение расхождения Кульбака-Лейблера между двумя распределениями вероятностей.

In [8]:
# Создание объекта LogSoftmax
m = nn.LogSoftmax(dim = 1)

# Создание объекта KLDivLoss
loss = nn.KLDivLoss(reduction = "batchmean")

# Генерация входных данных и целевых меток
input = torch.tensor([[0.2, 0.3, 0.5], [0.1, 0.8, 0.1]], requires_grad = True)
target = torch.tensor([[0.1, 0.4, 0.5], [0.2, 0.7, 0.1]])

# Вычисление функции потерь
output = loss(m(input), target)

# Вывод значения функции потерь
print("Значение функции потерь:", output.item())

# Выполнение обратного прохода (backpropagation)
output.backward()

print("Градиенты по входным данным:", input.grad)
Значение функции потерь: 0.1021953895688057
Градиенты по входным данным: tensor([[ 0.0947, -0.0401, -0.0547],
        [ 0.0246, -0.0991,  0.0746]])

CrossEntropyLoss¶

Классификация

Комбинация LogSoftmax и NLLLoss (Negative Log Likelihood Loss) для измерения разницы между предсказанными вероятностями классов и истинными метками.

In [9]:
# Создание объекта CrossEntropyLoss
loss = nn.CrossEntropyLoss(reduction = "mean", label_smoothing = 0.0) # none | mean | sum

# Генерация входных данных и целевых меток
input = torch.tensor([[1.0, 2.0, 3.0], [1.0, 2.0, 1.0]], requires_grad = True) # torch.randn(2, 3)
target = torch.tensor([2, 1])

# Вычисление функции потерь
output = loss(input, target)

# Вывод значения функции потерь
print("Кросс-энтропийная ошибка:", output.item())

# Выполнение обратного прохода (backpropagation)
output.backward()

print("Градиенты по входным данным:", input.grad)
Кросс-энтропийная ошибка: 0.47952529788017273
Градиенты по входным данным: tensor([[ 0.0450,  0.1224, -0.1674],
        [ 0.1060, -0.2119,  0.1060]])

NLLLoss¶

Классификация

Измерение разницы между предсказанными вероятностями классов (после применения LogSoftmax) и истинными метками.

In [10]:
# Создание объекта LogSoftmax
m = nn.LogSoftmax(dim = 1)

# Создание объекта NLLLoss
loss = nn.NLLLoss(reduction = "mean") # none | mean | sum

# Генерация входных данных и целевых меток
input = torch.tensor([[1.0, 2.0, 3.0], [1.0, 2.0, 1.0]], requires_grad = True) # torch.randn(2, 3)
target = torch.tensor([2, 1])

# Вычисление функции потерь
output = loss(m(input), target)

# Вывод значения функции потерь
print("Значение функции потерь:", output.item())

# Выполнение обратного прохода (backpropagation)
output.backward()

print("Градиенты по входным данным:", input.grad)
Значение функции потерь: 0.47952529788017273
Градиенты по входным данным: tensor([[ 0.0450,  0.1224, -0.1674],
        [ 0.1060, -0.2119,  0.1060]])

BCELoss (Binary Cross Entropy Loss)¶

Бинарная классификация

Измерение разницы между предсказанными вероятностями и истинными бинарными метками, используя кросс-энтропийную функцию потерь.

In [11]:
# Создание объекта BCELoss
loss = nn.BCELoss(reduction = "mean") # none | mean | sum

# Генерация входных данных и целевых меток
input = torch.tensor([[0.8], [0.2], [0.6]], requires_grad = True)
target = torch.tensor([[1.0], [0.0], [1.0]])

# Вычисление функции потерь
output = loss(input, target)

# Вывод значения функции потерь
print("Значение функции потерь:", output.item())

# Выполнение обратного прохода (backpropagation)
output.backward()

print("Градиенты по входным данным:", input.grad)
Значение функции потерь: 0.3190375566482544
Градиенты по входным данным: tensor([[-0.4167],
        [ 0.4167],
        [-0.5556]])

BCEWithLogitsLoss¶

Бинарная классификация

Измерение разницы между предсказанными логитами и истинными бинарными метками, объединяя в себе вычисление сигмоиды и бинарной кросс-энтропии.

In [12]:
# Создание объекта BCEWithLogitsLoss
loss = nn.BCEWithLogitsLoss(reduction = "mean") # none | mean | sum

# Генерация входных данных и целевых меток
input = torch.tensor([[1.5], [-1.5], [0.0]], requires_grad = True)
target = torch.tensor([[1.0], [0.0], [1.0]])

# Вычисление функции потерь
output = loss(input, target)

# Вывод значения функции потерь
print("Значение функции потерь:", output.item())

# Выполнение обратного прохода (backpropagation)
output.backward()

print("Градиенты по входным данным:", input.grad)
Значение функции потерь: 0.36532461643218994
Градиенты по входным данным: tensor([[-0.0608],
        [ 0.0608],
        [-0.1667]])

MarginRankingLoss¶

Ранжирование

Ранжирование пар

In [13]:
# Создание объекта MarginRankingLoss
loss = nn.MarginRankingLoss(reduction = "mean") # none | mean | sum

# Генерация входных данных и целевых меток
input1 = torch.tensor([0.8, 0.7, -0.2], requires_grad = True)
input2 = torch.tensor([0.1, -0.1, 0.5], requires_grad = True)
target = torch.tensor([1, 2, 2])

# Вычисление функции потерь
output = loss(input1, input2, target)

# Вывод значения функции потерь
print("Значение функции потерь:", output.item())

# Выполнение обратного прохода (backpropagation)
output.backward()

print("Градиенты по входным данным:", input.grad)
Значение функции потерь: 0.46666666865348816
Градиенты по входным данным: tensor([[-0.0608],
        [ 0.0608],
        [-0.1667]])