Версия Python¶
!python -V
Python 3.12.6
Импорт необходимых библиотек¶
# Подавление предупреждений
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
Версии необходимых библиотек¶
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-норма или средняя абсолютная ошибка)¶
Регрессия
Измерение средней абсолютной разницы между предсказанными и истинными значениями нейросетевой модели.
# Создание объекта 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)¶
Регрессия
Измерение среднеквадратичной ошибки между предсказанными и истинными значениями нейросетевой модели.
# Создание объекта 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¶
Регрессия
Измерение отрицательного логарифмического правдоподобия предсказанных значений, предполагая, что целевые метки следуют распределению Пуассона.
# Создание объекта 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¶
Регрессия
Измерение отрицательного логарифмического правдоподобия предсказанных значений и дисперсий, предполагая, что целевые метки следуют нормальному распределению.
# Создание объекта 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)¶
Регрессия
Измерение расхождения Кульбака-Лейблера между двумя распределениями вероятностей.
# Создание объекта 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) для измерения разницы между предсказанными вероятностями классов и истинными метками.
# Создание объекта 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) и истинными метками.
# Создание объекта 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)¶
Бинарная классификация
Измерение разницы между предсказанными вероятностями и истинными бинарными метками, используя кросс-энтропийную функцию потерь.
# Создание объекта 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¶
Бинарная классификация
Измерение разницы между предсказанными логитами и истинными бинарными метками, объединяя в себе вычисление сигмоиды и бинарной кросс-энтропии.
# Создание объекта 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
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]])