Функция allclose
Функция allclose проверяет, равны ли два тензора с учётом заданных допусков. Она возвращает True, если для всех элементов выполняется условие: |a - b| <= (atol + rtol * |b|). Первым параметром передаётся первый тензор, вторым - второй тензор. Третьим параметром можно передать абсолютный допуск atol (по умолчанию 1e-8), четвёртым - относительный допуск rtol (по умолчанию 1e-5). Функция полезна при тестировании, когда из-за ошибок округления числа не совпадают точно.
Синтаксис
torch.allclose(a, b, rtol=1e-05, atol=1e-08)
Пример
Сравним два тензора, которые отличаются на очень маленькую величину:
import torch
t1 = torch.tensor([1.0, 2.0, 3.0])
t2 = torch.tensor([1.0, 2.0, 3.0000001])
res = torch.allclose(t1, t2)
print(res)
Результат выполнения кода:
"True"
Функция вернула True, так как разница меньше допусков.
Пример
Теперь увеличим разницу и явно зададим малый абсолютный допуск:
import torch
t1 = torch.tensor([1.0, 2.0, 3.0])
t2 = torch.tensor([1.0, 2.0, 3.1])
res = torch.allclose(t1, t2, atol=1e-3)
print(res)
Результат выполнения кода:
"False"
Функция вернула False, так как разница превысила заданный допуск.
Пример
Сравним двумерные тензоры с большими значениями, где относительный допуск играет важную роль:
import torch
t1 = torch.tensor([[1e5, 2e5], [3e5, 4e5]])
t2 = torch.tensor([[1e5, 2e5], [3e5, 4e5 + 1e-3]])
res = torch.allclose(t1, t2)
print(res)
Результат выполнения кода:
"True"
Несмотря на абсолютную разницу 1e-3, функция вернула True из-за большого относительного допуска для больших чисел.
Пример
Используем allclose для проверки работы модели после обучения на синтетических данных:
import torch
torch.manual_seed(0)
x = torch.randn(3, 3)
layer = torch.nn.Linear(3, 3)
y1 = layer(x)
# Сохраняем состояние и восстанавливаем
state = layer.state_dict()
layer.load_state_dict(state)
y2 = layer(x)
res = torch.allclose(y1, y2)
print(res)
Результат выполнения кода:
"True"
Функция подтвердила, что выходы модели совпадают после восстановления весов.