Метод __new__ класса Parameter
Метод __new__ класса Parameter управляет созданием новых экземпляров параметров в PyTorch. В отличие от обычного конструктора __init__, __new__ вызывается до создания объекта и отвечает за выделение памяти и возврат нового экземпляра. Этот метод полезен для кастомизации процесса создания параметров, например, для задания дополнительных атрибутов или проверки переданных данных. Первым параметром метод принимает сам класс, вторым - тензор с данными, а также поддерживает дополнительные аргументы, такие как requires_grad.
Синтаксис
Parameter.__new__(cls, data=None, requires_grad=True)
Пример
Давайте создадим параметр с помощью метода __new__ напрямую:
import torch
from torch.nn.parameter import Parameter
data = torch.tensor([1., 2., 3., 4., 5.])
param = Parameter.__new__(Parameter, data)
print(param)
Результат выполнения кода:
Parameter containing:
tensor([1., 2., 3., 4., 5.], requires_grad=True)
Пример
Метод __new__ позволяет создать параметр с отключенным вычислением градиента:
import torch
from torch.nn.parameter import Parameter
data = torch.tensor([1., 2., 3., 4., 5.])
param = Parameter.__new__(Parameter, data, requires_grad=False)
print(param)
Результат выполнения кода:
Parameter containing:
tensor([1., 2., 3., 4., 5.], requires_grad=False)
Пример
Использование __new__ при создании пользовательского класса параметров:
import torch
from torch.nn.parameter import Parameter
class MyParameter(Parameter):
def __new__(cls, data, name=None):
instance = super().__new__(cls, data)
instance.name = name
return instance
data = torch.tensor([1., 2., 3., 4., 5.])
param = MyParameter(data, "weights")
print(param.name)
print(param)
Результат выполнения кода:
weights
Parameter containing:
tensor([1., 2., 3., 4., 5.], requires_grad=True)
Пример
Метод __new__ автоматически вызывается при создании параметра через стандартный конструктор:
import torch
from torch.nn.parameter import Parameter
param = Parameter(torch.tensor([1., 2., 3., 4., 5.]))
print(param)
Результат выполнения кода:
Parameter containing:
tensor([1., 2., 3., 4., 5.], requires_grad=True)