我可以将方法定义为属性吗?
Can I define a method as an attribute?
上面的题目有点歧义,解释如下:
class Trainer:
"""Object used to facilitate training."""
def __init__(
self,
# params: Namespace,
params,
model,
device=torch.device("cpu"),
optimizer=None,
scheduler=None,
wandb_run=None,
early_stopping: callbacks.EarlyStopping = None,
):
# Set params
self.params = params
self.model = model
self.device = device
# self.optimizer = optimizer
self.optimizer = self.get_optimizer()
self.scheduler = scheduler
self.wandb_run = wandb_run
self.early_stopping = early_stopping
# list to contain various train metrics
# TODO: how to add more metrics? wandb log too. Maybe save to model artifacts?
self.history = DefaultDict(list)
@staticmethod
def get_optimizer(
model: models.CustomNeuralNet,
optimizer_params: global_params.OptimizerParams(),
):
"""Get the optimizer for the model.
Args:
model (models.CustomNeuralNet): [description]
optimizer_params (global_params.OptimizerParams): [description]
Returns:
[type]: [description]
"""
return getattr(torch.optim, optimizer_params.optimizer_name)(
model.parameters(), **optimizer_params.optimizer_params
)
请注意,最初我在构造函数中传入了 optimizer
,我将在此 class 之外调用它。但是,我现在将 get_optimizer
放在 class 本身中(出于一致性目的,但不确定是否可以)。那么,我还是应该定义self.optimizer = self.get_optimizer()
还是只在class中的指定位置使用self.get_optimizer()
?前者为我提供了一些可读性。
附录:我现在将实例放在 .fit()
方法中,我将调用 say 5 次来训练模型 5 次。在这种情况下,即使不会有任何明显的问题,因为我们每次调用都使用一次优化器,但不在此处定义 self.optimizer
是否更好?
def fit(
self,
train_loader: torch.utils.data.DataLoader,
valid_loader: torch.utils.data.DataLoader,
fold: int = None,
):
"""[summary]
Args:
train_loader (torch.utils.data.DataLoader): [description]
val_loader (torch.utils.data.DataLoader): [description]
fold (int, optional): [description]. Defaults to None.
Returns:
[type]: [description]
"""
self.optimizer = self.get_optimizer(
model=self.model, optimizer_params=OPTIMIZER_PARAMS
)
self.scheduler = self.get_scheduler(
optimizer=self.optimizer, scheduler_params=SCHEDULER_PARAMS
)
两者有区别:每次调用你的get_optimizer
都会实例化一个newtorch.optim.<optimizer>
。相反,设置 self.optimizer
并在以后多次访问它只会创建一个 单个 优化器实例。
上面的题目有点歧义,解释如下:
class Trainer:
"""Object used to facilitate training."""
def __init__(
self,
# params: Namespace,
params,
model,
device=torch.device("cpu"),
optimizer=None,
scheduler=None,
wandb_run=None,
early_stopping: callbacks.EarlyStopping = None,
):
# Set params
self.params = params
self.model = model
self.device = device
# self.optimizer = optimizer
self.optimizer = self.get_optimizer()
self.scheduler = scheduler
self.wandb_run = wandb_run
self.early_stopping = early_stopping
# list to contain various train metrics
# TODO: how to add more metrics? wandb log too. Maybe save to model artifacts?
self.history = DefaultDict(list)
@staticmethod
def get_optimizer(
model: models.CustomNeuralNet,
optimizer_params: global_params.OptimizerParams(),
):
"""Get the optimizer for the model.
Args:
model (models.CustomNeuralNet): [description]
optimizer_params (global_params.OptimizerParams): [description]
Returns:
[type]: [description]
"""
return getattr(torch.optim, optimizer_params.optimizer_name)(
model.parameters(), **optimizer_params.optimizer_params
)
请注意,最初我在构造函数中传入了 optimizer
,我将在此 class 之外调用它。但是,我现在将 get_optimizer
放在 class 本身中(出于一致性目的,但不确定是否可以)。那么,我还是应该定义self.optimizer = self.get_optimizer()
还是只在class中的指定位置使用self.get_optimizer()
?前者为我提供了一些可读性。
附录:我现在将实例放在 .fit()
方法中,我将调用 say 5 次来训练模型 5 次。在这种情况下,即使不会有任何明显的问题,因为我们每次调用都使用一次优化器,但不在此处定义 self.optimizer
是否更好?
def fit(
self,
train_loader: torch.utils.data.DataLoader,
valid_loader: torch.utils.data.DataLoader,
fold: int = None,
):
"""[summary]
Args:
train_loader (torch.utils.data.DataLoader): [description]
val_loader (torch.utils.data.DataLoader): [description]
fold (int, optional): [description]. Defaults to None.
Returns:
[type]: [description]
"""
self.optimizer = self.get_optimizer(
model=self.model, optimizer_params=OPTIMIZER_PARAMS
)
self.scheduler = self.get_scheduler(
optimizer=self.optimizer, scheduler_params=SCHEDULER_PARAMS
)
两者有区别:每次调用你的get_optimizer
都会实例化一个newtorch.optim.<optimizer>
。相反,设置 self.optimizer
并在以后多次访问它只会创建一个 单个 优化器实例。