【问题标题】:Can I define a method as an attribute?我可以将方法定义为属性吗?
【发布时间】:2022-01-03 11:45:32
【问题描述】:

上面的题目有点含糊,下面是解释:

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,我将在该类之外调用它。但是,我现在将get_optimizer 放在类本身中(出于一致性目的,但不确定是否可以)。那么,我应该仍然定义self.optimizer = self.get_optimizer() 还是只在课堂上的指定位置使用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
        )

【问题讨论】:

    标签: python python-3.x pytorch


    【解决方案1】:

    两者之间有区别:每次调用get_optimizer 都会实例化一个 torch.optim.<optimizer>。相反,设置self.optimizer 并在以后多次访问它只会创建一个单个优化器实例。

    【讨论】:

    • 非常感谢,我添加了一个附录,关于我是否应该/不应该这样做。
    • @ilovewt 在这种情况下,get_optimizer 应该是“ptivate”并且只能在 __init__ 内部调用
    • 谢谢!最后一个问题,由于get_optimizer 不调用self,我把它变成了一个静态方法。我仍然应该在 init 下调用 self.optimizer = self.get_optimizer() 对吗?
    猜你喜欢
    • 2016-10-06
    • 2014-06-26
    • 2012-10-18
    • 1970-01-01
    • 1970-01-01
    • 2011-01-08
    • 2018-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多