pytorch-optimizer 3.8.1__tar.gz → 3.8.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/PKG-INFO +3 -2
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pyproject.toml +4 -2
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/base/exception.py +8 -6
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/base/optimizer.py +100 -90
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/base/scheduler.py +12 -10
- pytorch_optimizer-3.8.2/pytorch_optimizer/base/type.py +27 -0
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/loss/bi_tempered.py +46 -37
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/loss/cross_entropy.py +5 -4
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/loss/dice.py +23 -20
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/loss/f1.py +4 -3
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/loss/focal.py +24 -20
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/loss/jaccard.py +21 -18
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/loss/ldam.py +6 -5
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/loss/lovasz.py +7 -5
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/loss/tversky.py +5 -4
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/lr_scheduler/chebyshev.py +32 -19
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/lr_scheduler/cosine_anealing.py +10 -9
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/lr_scheduler/experimental/deberta_v3_lr_scheduler.py +14 -13
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/lr_scheduler/linear_warmup.py +6 -5
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/lr_scheduler/proportion.py +16 -8
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/lr_scheduler/rex.py +6 -5
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/lr_scheduler/wsd.py +23 -23
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/__init__.py +2 -2
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/a2grad.py +16 -15
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/adabelief.py +22 -21
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/adabound.py +19 -18
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/adadelta.py +17 -16
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/adafactor.py +30 -29
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/adagc.py +22 -21
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/adahessian.py +24 -23
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/adai.py +20 -19
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/adalite.py +20 -19
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/adam_mini.py +21 -21
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/adamax.py +18 -17
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/adamc.py +18 -17
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/adamg.py +20 -19
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/adamod.py +19 -18
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/adamp.py +52 -49
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/adams.py +19 -18
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/adamw.py +19 -18
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/adan.py +18 -17
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/adanorm.py +20 -19
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/adapnm.py +19 -18
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/adashift.py +18 -17
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/adasmooth.py +18 -17
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/ademamix.py +40 -38
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/adopt.py +19 -18
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/agc.py +7 -6
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/aggmo.py +17 -16
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/aida.py +24 -23
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/alig.py +15 -14
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/amos.py +19 -18
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/apollo.py +37 -35
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/avagrad.py +18 -17
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/came.py +21 -20
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/conda.py +19 -18
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/dadapt.py +92 -87
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/demo.py +32 -25
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/diffgrad.py +22 -21
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/emonavi.py +89 -84
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/exadam.py +18 -17
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/experimental/ranger25.py +33 -32
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/fadam.py +20 -19
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/fira.py +16 -15
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/focus.py +16 -15
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/fp16.py +45 -40
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/fromage.py +14 -13
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/ftrl.py +16 -16
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/galore.py +16 -15
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/galore_utils.py +8 -7
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/gradient_centralization.py +5 -3
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/grams.py +17 -16
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/gravity.py +14 -13
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/grokfast.py +45 -45
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/kate.py +17 -16
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/lamb.py +27 -26
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/laprop.py +20 -19
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/lars.py +17 -16
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/lion.py +17 -16
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/lomo.py +27 -25
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/lookahead.py +14 -13
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/madgrad.py +17 -16
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/mars.py +28 -28
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/msvag.py +12 -11
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/muon.py +94 -105
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/nero.py +16 -15
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/novograd.py +19 -18
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/orthograd.py +10 -9
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/padam.py +17 -16
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/pcgrad.py +17 -15
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/pid.py +19 -18
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/pnm.py +18 -17
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/prodigy.py +28 -27
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/psgd.py +31 -30
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/psgd_utils.py +12 -11
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/qhadam.py +19 -18
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/qhm.py +17 -16
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/racs.py +43 -41
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/radam.py +20 -19
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/ranger.py +22 -21
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/ranger21.py +50 -49
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/rotograd.py +47 -43
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/sam.py +119 -106
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/schedulefree.py +94 -93
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/scion.py +55 -49
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/sgd.py +101 -95
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/shampoo.py +63 -74
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/shampoo_utils.py +118 -93
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/sm3.py +18 -16
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/snsm.py +30 -30
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/soap.py +26 -25
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/sophia.py +22 -21
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/spam.py +50 -45
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/splus.py +27 -26
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/srmm.py +12 -11
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/swats.py +20 -19
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/tam.py +24 -23
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/tiger.py +14 -13
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/trac.py +26 -24
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/utils.py +57 -50
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/yogi.py +17 -16
- pytorch_optimizer-3.8.1/pytorch_optimizer/base/type.py +0 -21
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/LICENSE +0 -0
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/README.md +0 -0
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/__init__.py +0 -0
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/base/__init__.py +0 -0
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/loss/__init__.py +0 -0
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/lr_scheduler/__init__.py +0 -0
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/lr_scheduler/experimental/__init__.py +0 -0
- {pytorch_optimizer-3.8.1 → pytorch_optimizer-3.8.2}/pytorch_optimizer/optimizer/experimental/__init__.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pytorch_optimizer
|
|
3
|
-
Version: 3.8.
|
|
3
|
+
Version: 3.8.2
|
|
4
4
|
Summary: optimizer & lr scheduler & objective function collections in PyTorch
|
|
5
5
|
License: Apache-2.0
|
|
6
6
|
License-File: LICENSE
|
|
@@ -31,8 +31,9 @@ Classifier: Topic :: Software Development :: Libraries
|
|
|
31
31
|
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
32
32
|
Requires-Dist: numpy (<=1.24.4) ; python_version < "3.9"
|
|
33
33
|
Requires-Dist: numpy (>1.24.4) ; python_version >= "3.9"
|
|
34
|
-
Requires-Dist: torch (>=1.10) ; python_version >= "3.
|
|
34
|
+
Requires-Dist: torch (>=1.10) ; python_version >= "3.10"
|
|
35
35
|
Requires-Dist: torch (>=1.10,<2.5) ; python_version < "3.9"
|
|
36
|
+
Requires-Dist: torch (>=1.10,<2.9) ; python_version == "3.9"
|
|
36
37
|
Project-URL: Documentation, https://pytorch-optimizers.readthedocs.io/en/latest
|
|
37
38
|
Project-URL: Homepage, https://github.com/kozistr/pytorch_optimizer
|
|
38
39
|
Project-URL: Repository, https://github.com/kozistr/pytorch_optimizer
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[tool.poetry]
|
|
2
2
|
name = "pytorch_optimizer"
|
|
3
|
-
version = "3.8.
|
|
3
|
+
version = "3.8.2"
|
|
4
4
|
description = "optimizer & lr scheduler & objective function collections in PyTorch"
|
|
5
5
|
license = "Apache-2.0"
|
|
6
6
|
authors = ["kozistr <kozistr@gmail.com>"]
|
|
@@ -37,6 +37,7 @@ classifiers = [
|
|
|
37
37
|
"Programming Language :: Python :: 3.11",
|
|
38
38
|
"Programming Language :: Python :: 3.12",
|
|
39
39
|
"Programming Language :: Python :: 3.13",
|
|
40
|
+
"Programming Language :: Python :: 3.14",
|
|
40
41
|
"Operating System :: OS Independent",
|
|
41
42
|
"Topic :: Scientific/Engineering",
|
|
42
43
|
"Topic :: Scientific/Engineering :: Artificial Intelligence",
|
|
@@ -53,7 +54,8 @@ numpy = [
|
|
|
53
54
|
]
|
|
54
55
|
torch = [
|
|
55
56
|
{ version = ">=1.10,<2.5", python = "<3.9", source = "torch" },
|
|
56
|
-
{ version = ">=1.10", python = ">=3.9", source = "torch" },
|
|
57
|
+
{ version = ">=1.10,<2.9", python = ">=3.9,<3.10", source = "torch" },
|
|
58
|
+
{ version = ">=1.10", python = ">=3.10", source = "torch" },
|
|
57
59
|
]
|
|
58
60
|
|
|
59
61
|
[tool.poetry.group.dev.dependencies]
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
class NoSparseGradientError(Exception):
|
|
2
|
-
"""Raised when the gradient is sparse gradient.
|
|
2
|
+
r"""Raised when the gradient is sparse gradient.
|
|
3
3
|
|
|
4
|
-
:
|
|
5
|
-
|
|
4
|
+
Args:
|
|
5
|
+
optimizer_name (str): The name of the optimizer where the error occurred.
|
|
6
|
+
note (str): Additional special conditions or notes (default is an empty string).
|
|
6
7
|
"""
|
|
7
8
|
|
|
8
9
|
def __init__(self, optimizer_name: str, note: str = ''):
|
|
@@ -46,10 +47,11 @@ class NegativeStepError(Exception):
|
|
|
46
47
|
|
|
47
48
|
|
|
48
49
|
class NoComplexParameterError(Exception):
|
|
49
|
-
"""Raised when the dtype of the parameter is complex.
|
|
50
|
+
r"""Raised when the dtype of the parameter is complex.
|
|
50
51
|
|
|
51
|
-
:
|
|
52
|
-
|
|
52
|
+
Args:
|
|
53
|
+
optimizer_name (str): The name of the optimizer where the error occurred.
|
|
54
|
+
note (str): Additional special conditions or notes (default is an empty string).
|
|
53
55
|
"""
|
|
54
56
|
|
|
55
57
|
def __init__(self, optimizer_name: str, note: str = ''):
|
|
@@ -4,31 +4,30 @@ from typing import List, Optional, Tuple, Union
|
|
|
4
4
|
|
|
5
5
|
import torch
|
|
6
6
|
from torch.optim import Optimizer
|
|
7
|
-
from torch.optim.optimizer import ParamsT
|
|
8
7
|
|
|
9
8
|
from pytorch_optimizer.base.exception import NegativeLRError, NegativeStepError
|
|
10
9
|
from pytorch_optimizer.base.type import (
|
|
11
|
-
BETAS,
|
|
12
|
-
CLOSURE,
|
|
13
|
-
DEFAULTS,
|
|
14
|
-
GROUP,
|
|
15
10
|
HUTCHINSON_G,
|
|
16
|
-
LOSS,
|
|
17
11
|
OPTIMIZER_INSTANCE_OR_CLASS,
|
|
18
|
-
|
|
19
|
-
|
|
12
|
+
Betas,
|
|
13
|
+
Closure,
|
|
14
|
+
Defaults,
|
|
15
|
+
Loss,
|
|
16
|
+
Parameters,
|
|
17
|
+
ParamGroup,
|
|
18
|
+
State,
|
|
20
19
|
)
|
|
21
20
|
|
|
22
21
|
|
|
23
22
|
class BaseOptimizer(ABC, Optimizer):
|
|
24
|
-
|
|
23
|
+
"""Base optimizer class. Provides common functionalities for the optimizers."""
|
|
25
24
|
|
|
26
|
-
def __init__(self, params:
|
|
25
|
+
def __init__(self, params: Parameters, defaults: Defaults) -> None:
|
|
27
26
|
super().__init__(params, defaults)
|
|
28
27
|
|
|
29
28
|
@staticmethod
|
|
30
29
|
def load_optimizer(optimizer: OPTIMIZER_INSTANCE_OR_CLASS, **kwargs) -> Optimizer:
|
|
31
|
-
|
|
30
|
+
"""Build torch.optim.Optimizer class."""
|
|
32
31
|
if isinstance(optimizer, Optimizer):
|
|
33
32
|
return optimizer
|
|
34
33
|
|
|
@@ -40,23 +39,23 @@ class BaseOptimizer(ABC, Optimizer):
|
|
|
40
39
|
|
|
41
40
|
@staticmethod
|
|
42
41
|
@torch.no_grad()
|
|
43
|
-
def set_hessian(param_groups:
|
|
44
|
-
|
|
42
|
+
def set_hessian(param_groups: Parameters, state: State, hessian: List[torch.Tensor]) -> None:
|
|
43
|
+
"""Set hessian to state from external source. Generally useful when using functorch as a base.
|
|
44
|
+
|
|
45
|
+
Args:
|
|
46
|
+
param_groups: PARAMETERS. Parameter groups from optimizer.
|
|
47
|
+
state: STATE. Optimizer state dictionary.
|
|
48
|
+
hessian: List[torch.Tensor]. Sequence of Hessian tensors to set.
|
|
45
49
|
|
|
46
50
|
Example:
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
hessian_diag_est = tree_map(lambda a, b: a * b, hvp_est, noise)
|
|
51
|
+
# Hutchinson's Estimator using Hessian-vector product (HVP)
|
|
52
|
+
>>> noise = tree_map(lambda v: torch.randn_like(v), params)
|
|
53
|
+
>>> loss_, hvp_est = jvp(grad(run_model_fn), (params,), (noise,))
|
|
54
|
+
>>> hessian_diag_est = tree_map(lambda a, b: a * b, hvp_est, noise)
|
|
52
55
|
|
|
53
|
-
optimizer.set_hessian(hessian_diag_est)
|
|
56
|
+
>>> optimizer.set_hessian(hessian_diag_est)
|
|
54
57
|
# OR
|
|
55
|
-
optimizer.step(hessian=hessian_diag_est)
|
|
56
|
-
|
|
57
|
-
:param param_groups: PARAMETERS. parameter groups.
|
|
58
|
-
:param state: STATE. optimizer state.
|
|
59
|
-
:param hessian: List[torch.Tensor]. sequence of hessian to set.
|
|
58
|
+
>>> optimizer.step(hessian=hessian_diag_est)
|
|
60
59
|
"""
|
|
61
60
|
i: int = 0
|
|
62
61
|
for group in param_groups:
|
|
@@ -70,12 +69,13 @@ class BaseOptimizer(ABC, Optimizer):
|
|
|
70
69
|
i += 1
|
|
71
70
|
|
|
72
71
|
@staticmethod
|
|
73
|
-
def zero_hessian(param_groups:
|
|
74
|
-
|
|
72
|
+
def zero_hessian(param_groups: Parameters, state: State, pre_zero: bool = True) -> None:
|
|
73
|
+
"""Zero-out Hessian.
|
|
75
74
|
|
|
76
|
-
:
|
|
77
|
-
|
|
78
|
-
|
|
75
|
+
Args:
|
|
76
|
+
param_groups (Parameters): Parameter groups from the optimizer.
|
|
77
|
+
state (State): Optimizer state dictionary.
|
|
78
|
+
pre_zero (bool): If True, zero-out the Hessian before computing/updating it.
|
|
79
79
|
"""
|
|
80
80
|
for group in param_groups:
|
|
81
81
|
for p in group['params']:
|
|
@@ -88,19 +88,20 @@ class BaseOptimizer(ABC, Optimizer):
|
|
|
88
88
|
@staticmethod
|
|
89
89
|
@torch.no_grad()
|
|
90
90
|
def compute_hutchinson_hessian(
|
|
91
|
-
param_groups:
|
|
92
|
-
state:
|
|
91
|
+
param_groups: Parameters,
|
|
92
|
+
state: State,
|
|
93
93
|
num_samples: int = 1,
|
|
94
94
|
alpha: float = 1.0,
|
|
95
95
|
distribution: HUTCHINSON_G = 'gaussian',
|
|
96
96
|
) -> None:
|
|
97
|
-
r"""Hutchinson's approximate
|
|
98
|
-
|
|
99
|
-
:
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
97
|
+
r"""Hutchinson's approximate Hessian, added to the state under key `hessian`.
|
|
98
|
+
|
|
99
|
+
Args:
|
|
100
|
+
param_groups (Parameters): Parameter groups from the optimizer.
|
|
101
|
+
state (State): Optimizer state dictionary.
|
|
102
|
+
num_samples (int): Number of times to sample noise vector `z` for the trace approximation.
|
|
103
|
+
alpha (float): Scaling factor for the Hessian estimate.
|
|
104
|
+
distribution (HUTCHINSON_G): Type of noise distribution used (e.g., Rademacher).
|
|
104
105
|
"""
|
|
105
106
|
if distribution not in ('gaussian', 'rademacher'):
|
|
106
107
|
raise NotImplementedError(f'hessian with distribution {distribution} is not implemented.')
|
|
@@ -136,15 +137,16 @@ class BaseOptimizer(ABC, Optimizer):
|
|
|
136
137
|
fixed_decay: bool,
|
|
137
138
|
ratio: Optional[float] = None,
|
|
138
139
|
) -> None:
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
:
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
140
|
+
"""Apply weight decay.
|
|
141
|
+
|
|
142
|
+
Args:
|
|
143
|
+
p (torch.Tensor): Parameter tensor to apply weight decay to.
|
|
144
|
+
grad (torch.Tensor): Gradient tensor of parameter p.
|
|
145
|
+
lr (float): Learning rate to scale the update.
|
|
146
|
+
weight_decay (float): Weight decay coefficient (L2 penalty).
|
|
147
|
+
weight_decouple (bool): If True, applies decoupled weight decay as in AdamW.
|
|
148
|
+
fixed_decay (bool): If True, fixes weight decay to not depend on learning rate.
|
|
149
|
+
ratio (Optional[float]): Optional scaling factor for weight decay.
|
|
148
150
|
"""
|
|
149
151
|
if weight_decouple:
|
|
150
152
|
p.mul_(1.0 - weight_decay * (1.0 if fixed_decay else lr) * (ratio if ratio is not None else 1.0))
|
|
@@ -159,13 +161,14 @@ class BaseOptimizer(ABC, Optimizer):
|
|
|
159
161
|
eps: float,
|
|
160
162
|
exp_avg_sq_eps: float = 1e-15,
|
|
161
163
|
) -> torch.Tensor:
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
:
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
164
|
+
"""Apply AMSBound variant.
|
|
165
|
+
|
|
166
|
+
Args:
|
|
167
|
+
ams_bound (bool): Whether to apply the AMSBound variant.
|
|
168
|
+
exp_avg_sq (torch.Tensor): Exponential moving average of squared gradients.
|
|
169
|
+
max_exp_avg_sq (Optional[torch.Tensor]): Maximum of all exp_avg_sq elements, for AMSBound.
|
|
170
|
+
eps (float): Small epsilon value for numerical stability.
|
|
171
|
+
exp_avg_sq_eps (float): Epsilon used specifically for numerical stability in exp_avg_sq computations.
|
|
169
172
|
"""
|
|
170
173
|
if ams_bound:
|
|
171
174
|
if torch.is_complex(max_exp_avg_sq):
|
|
@@ -180,10 +183,11 @@ class BaseOptimizer(ABC, Optimizer):
|
|
|
180
183
|
|
|
181
184
|
@staticmethod
|
|
182
185
|
def debias(beta: float, step: int) -> float:
|
|
183
|
-
|
|
186
|
+
"""Adam-style debias correction.
|
|
184
187
|
|
|
185
|
-
:
|
|
186
|
-
|
|
188
|
+
Args:
|
|
189
|
+
beta (float): Exponential decay rate for moment estimates.
|
|
190
|
+
step (int): Current optimization step number.
|
|
187
191
|
"""
|
|
188
192
|
return 1.0 - math.pow(beta, step) # fmt: skip
|
|
189
193
|
|
|
@@ -193,19 +197,21 @@ class BaseOptimizer(ABC, Optimizer):
|
|
|
193
197
|
|
|
194
198
|
Simplified version of `\^{beta} = beta * (1.0 - beta ** (step - 1)) / (1.0 - beta ** step)`
|
|
195
199
|
|
|
196
|
-
:
|
|
197
|
-
|
|
200
|
+
Args:
|
|
201
|
+
beta (float): The original beta decay rate.
|
|
202
|
+
step (int): Current optimization step number.
|
|
198
203
|
"""
|
|
199
204
|
beta_n: float = math.pow(beta, step)
|
|
200
205
|
return (beta_n - beta) / (beta_n - 1.0) # fmt: skip
|
|
201
206
|
|
|
202
207
|
@staticmethod
|
|
203
208
|
def apply_adam_debias(adam_debias: bool, step_size: float, bias_correction1: float) -> float:
|
|
204
|
-
|
|
209
|
+
"""Apply AdamD variant.
|
|
205
210
|
|
|
206
|
-
:
|
|
207
|
-
|
|
208
|
-
|
|
211
|
+
Args:
|
|
212
|
+
adam_debias (bool): If True, only corrects the denominator to avoid inflating step sizes early in training.
|
|
213
|
+
step_size (float): The step size for the update.
|
|
214
|
+
bias_correction1 (float): The bias correction factor for the first moment.
|
|
209
215
|
"""
|
|
210
216
|
return step_size if adam_debias else step_size / bias_correction1
|
|
211
217
|
|
|
@@ -218,14 +224,15 @@ class BaseOptimizer(ABC, Optimizer):
|
|
|
218
224
|
n_sma_threshold: int,
|
|
219
225
|
degenerated_to_sgd: bool,
|
|
220
226
|
) -> Tuple[float, float]:
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
:
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
227
|
+
"""Get step size for rectify optimizer.
|
|
228
|
+
|
|
229
|
+
Args:
|
|
230
|
+
is_rectify (bool): Whether to apply the rectify variant.
|
|
231
|
+
step (int): Current step number.
|
|
232
|
+
lr (float): Base learning rate.
|
|
233
|
+
beta2 (float): Beta2 parameter from optimizer (momentum term).
|
|
234
|
+
n_sma_threshold (float): Simple Moving Average (SMA) threshold for rectification.
|
|
235
|
+
degenerated_to_sgd (bool): Whether to degenerate to SGD if below threshold.
|
|
229
236
|
"""
|
|
230
237
|
step_size: float = lr
|
|
231
238
|
n_sma: float = 0.0
|
|
@@ -254,10 +261,11 @@ class BaseOptimizer(ABC, Optimizer):
|
|
|
254
261
|
) -> torch.Tensor:
|
|
255
262
|
r"""Get AdaNorm gradient.
|
|
256
263
|
|
|
257
|
-
:
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
264
|
+
Args:
|
|
265
|
+
grad (torch.Tensor): Gradient.
|
|
266
|
+
adanorm (bool): Whether to use the AdaNorm variant.
|
|
267
|
+
exp_grad_norm (Optional[torch.Tensor]): Exponential moving average of gradient norm.
|
|
268
|
+
r (Optional[float]): EMA factor; between 0.9 and 0.99 is preferred.
|
|
261
269
|
"""
|
|
262
270
|
if not adanorm or exp_grad_norm is None:
|
|
263
271
|
return grad
|
|
@@ -273,7 +281,7 @@ class BaseOptimizer(ABC, Optimizer):
|
|
|
273
281
|
|
|
274
282
|
@staticmethod
|
|
275
283
|
def get_rms(x: torch.Tensor) -> torch.Tensor:
|
|
276
|
-
|
|
284
|
+
"""Get RMS."""
|
|
277
285
|
return x.norm(2) / math.sqrt(x.numel())
|
|
278
286
|
|
|
279
287
|
@staticmethod
|
|
@@ -282,17 +290,18 @@ class BaseOptimizer(ABC, Optimizer):
|
|
|
282
290
|
exp_avg_sq_col: torch.Tensor,
|
|
283
291
|
output: torch.Tensor,
|
|
284
292
|
) -> None:
|
|
285
|
-
|
|
293
|
+
"""Get approximation of EMA of squared gradient."""
|
|
286
294
|
r_factor: torch.Tensor = (exp_avg_sq_row / exp_avg_sq_row.mean(dim=-1, keepdim=True)).rsqrt_().unsqueeze(-1)
|
|
287
295
|
c_factor: torch.Tensor = exp_avg_sq_col.unsqueeze(-2).rsqrt()
|
|
288
296
|
torch.mul(r_factor, c_factor, out=output)
|
|
289
297
|
|
|
290
298
|
@staticmethod
|
|
291
299
|
def apply_cautious(update: torch.Tensor, grad: torch.Tensor) -> None:
|
|
292
|
-
|
|
300
|
+
"""Apply the Cautious Optimizer feature.
|
|
293
301
|
|
|
294
|
-
:
|
|
295
|
-
|
|
302
|
+
Args:
|
|
303
|
+
update (torch.Tensor): update. it'll be masked in in-place manner.
|
|
304
|
+
grad (torch.Tensor): gradient.
|
|
296
305
|
"""
|
|
297
306
|
mask = (update * grad > 0).to(grad.dtype)
|
|
298
307
|
mask.mul_(mask.numel() / (mask.sum() + 1))
|
|
@@ -300,11 +309,12 @@ class BaseOptimizer(ABC, Optimizer):
|
|
|
300
309
|
|
|
301
310
|
@staticmethod
|
|
302
311
|
def get_stable_adamw_rms(grad: torch.Tensor, exp_avg_sq: torch.Tensor, eps: float = 1e-16) -> float:
|
|
303
|
-
|
|
312
|
+
"""Get StableAdamW RMS.
|
|
304
313
|
|
|
305
|
-
:
|
|
306
|
-
|
|
307
|
-
|
|
314
|
+
Args:
|
|
315
|
+
grad (torch.Tensor): gradient.
|
|
316
|
+
exp_avg_sq (torch.Tensor): Exponential moving average of squared gradient.
|
|
317
|
+
eps (float): Small value to prevent division by zero.
|
|
308
318
|
"""
|
|
309
319
|
return grad.pow(2).div_(exp_avg_sq.clip(min=eps)).mean().sqrt_().clip_(min=1.0).item()
|
|
310
320
|
|
|
@@ -362,7 +372,7 @@ class BaseOptimizer(ABC, Optimizer):
|
|
|
362
372
|
if x % y != 0:
|
|
363
373
|
raise ValueError(f'{x} must be divisible by {y}')
|
|
364
374
|
|
|
365
|
-
def validate_betas(self, betas:
|
|
375
|
+
def validate_betas(self, betas: Betas, beta_range_type: str = '[)', beta3_range_type: str = '[]') -> None:
|
|
366
376
|
if betas[0] is not None:
|
|
367
377
|
self.validate_range(betas[0], 'beta1', 0.0, 1.0, range_type=beta_range_type)
|
|
368
378
|
|
|
@@ -382,13 +392,13 @@ class BaseOptimizer(ABC, Optimizer):
|
|
|
382
392
|
self.validate_range(nus[1], 'nu2', 0.0, 1.0, range_type='[]')
|
|
383
393
|
|
|
384
394
|
@abstractmethod
|
|
385
|
-
def init_group(self, group:
|
|
386
|
-
|
|
395
|
+
def init_group(self, group: ParamGroup, **kwargs) -> None: # pragma: no cover
|
|
396
|
+
"""Initialize the group of the optimizer and return is_complex."""
|
|
387
397
|
return
|
|
388
398
|
|
|
389
399
|
@staticmethod
|
|
390
400
|
def view_as_real(param, *state_and_grads) -> tuple:
|
|
391
|
-
|
|
401
|
+
"""View imaginary tensors as real tensors."""
|
|
392
402
|
if torch.is_complex(param):
|
|
393
403
|
param = torch.view_as_real(param)
|
|
394
404
|
state_and_grads = tuple(
|
|
@@ -400,9 +410,9 @@ class BaseOptimizer(ABC, Optimizer):
|
|
|
400
410
|
|
|
401
411
|
@staticmethod
|
|
402
412
|
def maximize_gradient(grad: torch.Tensor, maximize: bool = False) -> None:
|
|
403
|
-
|
|
413
|
+
"""Maximize the objective with respect to the params, instead of minimizing."""
|
|
404
414
|
if maximize:
|
|
405
415
|
grad.neg_()
|
|
406
416
|
|
|
407
|
-
def step(self, closure:
|
|
417
|
+
def step(self, closure: Closure = None) -> Loss: # pragma: no cover
|
|
408
418
|
raise NotImplementedError
|
|
@@ -7,16 +7,18 @@ from pytorch_optimizer.base.exception import NegativeLRError, NegativeStepError
|
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
class BaseLinearWarmupScheduler(ABC):
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
:
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
10
|
+
"""BaseLinearWarmupScheduler class.
|
|
11
|
+
|
|
12
|
+
A learning rate scheduler class that implements a linear warmup strategy.
|
|
13
|
+
|
|
14
|
+
Args:
|
|
15
|
+
optimizer (Optimizer): The optimizer whose learning rate will be scheduled.
|
|
16
|
+
It will set the learning rate to all trainable parameters in the optimizer.
|
|
17
|
+
t_max (int): Total number of training steps (epochs or iterations).
|
|
18
|
+
max_lr (float): The maximum learning rate after warmup.
|
|
19
|
+
min_lr (float): The minimum learning rate to decay to (or start from if warmup).
|
|
20
|
+
init_lr (float): Initial learning rate at the start of warmup.
|
|
21
|
+
warmup_steps (int): Number of steps to warm up linearly from init_lr to max_lr.
|
|
20
22
|
"""
|
|
21
23
|
|
|
22
24
|
def __init__(
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
from typing import Any, Callable, Dict, Iterable, Literal, Optional, Tuple, Type, Union
|
|
2
|
+
|
|
3
|
+
import torch
|
|
4
|
+
from torch.optim import Optimizer
|
|
5
|
+
from torch.optim.lr_scheduler import LRScheduler
|
|
6
|
+
|
|
7
|
+
OPTIMIZER = Type[Optimizer]
|
|
8
|
+
OPTIMIZER_INSTANCE_OR_CLASS = Union[OPTIMIZER, Optimizer]
|
|
9
|
+
SCHEDULER = Type[LRScheduler]
|
|
10
|
+
|
|
11
|
+
Defaults = Dict[str, Any]
|
|
12
|
+
ParamGroup = Dict[str, Any]
|
|
13
|
+
State = Dict
|
|
14
|
+
Parameters = Optional[Union[Iterable[torch.Tensor], Iterable[ParamGroup]]]
|
|
15
|
+
|
|
16
|
+
Closure = Optional[Callable[[], float]]
|
|
17
|
+
Loss = Optional[float]
|
|
18
|
+
Betas = Union[
|
|
19
|
+
Tuple[float, float],
|
|
20
|
+
Tuple[float, float, float],
|
|
21
|
+
Tuple[None, float],
|
|
22
|
+
]
|
|
23
|
+
|
|
24
|
+
HUTCHINSON_G = Literal['gaussian', 'rademacher']
|
|
25
|
+
CLASS_MODE = Literal['binary', 'multiclass', 'multilabel']
|
|
26
|
+
|
|
27
|
+
DATA_FORMAT = Literal['channels_first', 'channels_last']
|
|
@@ -5,21 +5,22 @@ from torch import nn
|
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
def log_t(u: torch.Tensor, t: float) -> torch.Tensor:
|
|
8
|
-
|
|
8
|
+
"""Compute log_t for `u'."""
|
|
9
9
|
return u.log() if t == 1.0 else (u.pow(1.0 - t) - 1.0) / (1.0 - t)
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
def exp_t(u: torch.Tensor, t: float) -> torch.Tensor:
|
|
13
|
-
|
|
13
|
+
"""Compute exp_t for `u'."""
|
|
14
14
|
return u.exp() if t == 1 else (1.0 + (1.0 - t) * u).relu().pow(1.0 / (1.0 - t))
|
|
15
15
|
|
|
16
16
|
|
|
17
17
|
def compute_normalization_fixed_point(activations: torch.Tensor, t: float, num_iters: int) -> torch.Tensor:
|
|
18
18
|
r"""Return the normalization value for each example (t > 1.0).
|
|
19
19
|
|
|
20
|
-
:
|
|
21
|
-
|
|
22
|
-
|
|
20
|
+
Args:
|
|
21
|
+
activations (torch.Tensor): A multi-dimensional tensor with the last dimension representing classes.
|
|
22
|
+
t (float): Temperature value (> 1.0 for tail heaviness).
|
|
23
|
+
num_iters (int): Number of iterations to run the method.
|
|
23
24
|
"""
|
|
24
25
|
mu, _ = torch.max(activations, dim=-1, keepdim=True)
|
|
25
26
|
|
|
@@ -39,9 +40,10 @@ def compute_normalization_fixed_point(activations: torch.Tensor, t: float, num_i
|
|
|
39
40
|
def compute_normalization_binary_search(activations: torch.Tensor, t: float, num_iters: int) -> torch.Tensor:
|
|
40
41
|
"""Compute normalization value for each example (t < 1.0).
|
|
41
42
|
|
|
42
|
-
:
|
|
43
|
-
|
|
44
|
-
|
|
43
|
+
Args:
|
|
44
|
+
activations (torch.Tensor): A multidimensional tensor with the last dimension `num_classes`.
|
|
45
|
+
t (float): Temperature parameter (< 1.0 for peak sharpening).
|
|
46
|
+
num_iters (int): Number of iterations to run the normalization.
|
|
45
47
|
"""
|
|
46
48
|
mu, _ = torch.max(activations, dim=-1, keepdim=True)
|
|
47
49
|
normalized_activations = activations - mu
|
|
@@ -68,7 +70,7 @@ def compute_normalization_binary_search(activations: torch.Tensor, t: float, num
|
|
|
68
70
|
|
|
69
71
|
|
|
70
72
|
class ComputeNormalization(torch.autograd.Function):
|
|
71
|
-
|
|
73
|
+
"""Custom backward pass for compute_normalization. See compute_normalization."""
|
|
72
74
|
|
|
73
75
|
@staticmethod
|
|
74
76
|
def forward(ctx, activations: torch.Tensor, t: float, num_iters: int) -> torch.Tensor:
|
|
@@ -100,19 +102,21 @@ class ComputeNormalization(torch.autograd.Function):
|
|
|
100
102
|
def compute_normalization(activations: torch.Tensor, t: float, num_iters: int = 5) -> torch.Tensor:
|
|
101
103
|
r"""Compute normalization value for each example.
|
|
102
104
|
|
|
103
|
-
:
|
|
104
|
-
|
|
105
|
-
|
|
105
|
+
Args:
|
|
106
|
+
activations (torch.Tensor): A multi-dimensional tensor with the last dimension `num_classes`.
|
|
107
|
+
t (float): Temperature parameter (> 1.0 for tail heaviness).
|
|
108
|
+
num_iters (int): Number of iterations to run the method.
|
|
106
109
|
"""
|
|
107
110
|
return ComputeNormalization.apply(activations, t, num_iters)
|
|
108
111
|
|
|
109
112
|
|
|
110
113
|
def tempered_softmax(activations: torch.Tensor, t: float, num_iters: int = 5) -> torch.Tensor:
|
|
111
|
-
|
|
114
|
+
"""Tempered softmax function.
|
|
112
115
|
|
|
113
|
-
:
|
|
114
|
-
|
|
115
|
-
|
|
116
|
+
Args:
|
|
117
|
+
activations (torch.Tensor): A multidimensional tensor with last dimension `num_classes`.
|
|
118
|
+
t (float): Temperature parameter (> 1.0 for tail heaviness).
|
|
119
|
+
num_iters (int): Number of iterations to run the method.
|
|
116
120
|
"""
|
|
117
121
|
if t == 1.0:
|
|
118
122
|
return activations.softmax(dim=-1)
|
|
@@ -133,14 +137,15 @@ def bi_tempered_logistic_loss(
|
|
|
133
137
|
) -> torch.Tensor:
|
|
134
138
|
r"""Bi-Tempered Logistic Loss.
|
|
135
139
|
|
|
136
|
-
:
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
140
|
+
Args:
|
|
141
|
+
activations (torch.Tensor): A multidimensional tensor with last dimension `num_classes`.
|
|
142
|
+
labels (torch.Tensor): Tensor with the same shape and dtype as activations (one-hot encoded),
|
|
143
|
+
or a long tensor with one dimension less (class indices).
|
|
144
|
+
t1 (float): Temperature 1 (< 1.0 for boundedness of loss).
|
|
145
|
+
t2 (float): Temperature 2 (> 1.0 for tail heaviness, < 1.0 for finite support).
|
|
146
|
+
label_smooth (float): Label smoothing parameter, between 0 and 1.
|
|
147
|
+
num_iters (int): Number of iterations to run the normalization method.
|
|
148
|
+
reduction (str): Specifies reduction method to apply to output: 'none', 'mean', or 'sum'.
|
|
144
149
|
"""
|
|
145
150
|
if len(labels.shape) < len(activations.shape):
|
|
146
151
|
labels_onehot = torch.zeros_like(activations)
|
|
@@ -174,13 +179,15 @@ def bi_tempered_logistic_loss(
|
|
|
174
179
|
class BiTemperedLogisticLoss(nn.Module):
|
|
175
180
|
"""Bi-Tempered Log Loss.
|
|
176
181
|
|
|
177
|
-
Reference
|
|
182
|
+
Reference:
|
|
183
|
+
https://github.com/BloodAxe/pytorch-toolbelt/blob/develop/pytorch_toolbelt/losses/bitempered_loss.py
|
|
178
184
|
|
|
179
|
-
:
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
185
|
+
Args:
|
|
186
|
+
t1 (float): Temperature 1 (< 1.0 for boundedness).
|
|
187
|
+
t2 (float): Temperature 2 (> 1.0 for tail heaviness, < 1.0 for finite support).
|
|
188
|
+
label_smooth (float): Label smoothing parameter between 0 and 1.
|
|
189
|
+
ignore_index (Optional[int]): Index to ignore during loss calculation.
|
|
190
|
+
reduction (str): Type of reduction to apply to output, e.g. 'mean', 'sum', or 'none'.
|
|
184
191
|
"""
|
|
185
192
|
|
|
186
193
|
def __init__(
|
|
@@ -215,13 +222,15 @@ class BiTemperedLogisticLoss(nn.Module):
|
|
|
215
222
|
|
|
216
223
|
|
|
217
224
|
class BinaryBiTemperedLogisticLoss(nn.Module):
|
|
218
|
-
"""
|
|
219
|
-
|
|
220
|
-
:
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
+
"""Bi-Tempered Logistic Loss for Binary Classification.
|
|
226
|
+
|
|
227
|
+
Args:
|
|
228
|
+
t1 (float): Temperature 1 (< 1.0 for boundedness of the loss).
|
|
229
|
+
t2 (float): Temperature 2 (> 1.0 for tail heaviness, < 1.0 for finite support).
|
|
230
|
+
label_smooth (float): Label smoothing parameter between 0 and 1.
|
|
231
|
+
ignore_index (Optional[int]): Specifies a target value that is ignored and does not contribute
|
|
232
|
+
to the input gradient.
|
|
233
|
+
reduction (str): Specifies the reduction to apply to the output: 'none', 'mean', or 'sum'.
|
|
225
234
|
"""
|
|
226
235
|
|
|
227
236
|
def __init__(
|