Pytroch同一个优化器优化多个模型的参数并且保存优化后的参数

在进行深度学习过程中会遇到几个模型进行串联,这几个模型需要使用同一个优化器,但每个模型的学习率或者动量等其他参数不一样这种情况。一种解决方法是新建一个模型将这几个模型进行串联,另一种解决方法便是往优化器里面传入这几个模型的参数。

一、参考链接

pytroch中文文档

二、Pytroch同一个优化器载入多个模型的参数

为了方便介绍,这里面取两个模型进行说明,多个模型可以以此类推。
假设:1.采用的优化器为Adam,2.两个模型名称分别为Encoder(lr=0.01)、Decoder(lr=0.0001)。则代码如下:

optim.SGD([
                {'params': Encoder.parameters()},
                {'params': Decoder.parameters(), 'lr': 1e-4}
            ], lr=1e-2, momentum=0.9)

这意味着Encoder的参数将会使用1e-2的学习率,Decoder的参数将会使用1e-4的学习率,并且0.9momentum将会被用于所 有的参数。
个人觉得这个地方不熟悉是因为对pytroch的optimizer如何实现不熟悉,下面为pytroch的optimizer的初始化代码:

class Optimizer(object):
    r"""Base class for all optimizers.

    .. warning::
        Parameters need to be specified as collections that have a deterministic
        ordering that is consistent between runs. Examples of objects that don't
        satisfy those properties are sets and iterators over values of dictionaries.
        需要将参数指定为具有在运行之间一致的确定性排序的集合。不满足这些属性的对象示例是字典值的集合和迭代器。

    Arguments:
        params (iterable): an iterable of :class:`torch.Tensor` s or
            :class:`dict` s. Specifies what Tensors should be optimized.
        defaults: (dict): a dict containing default values of optimization
            options (used when a parameter group doesn't specify them).
        params (iterable):torch.Tensor 或 dict 的可迭代对象。指定应该优化哪些张量。
		默认值:(dict):包含优化选项默认值的字典(在参数组未指定它们时使用)。
    """

    def __init__(self, params, defaults):
        torch._C._log_api_usage_once("python.optimizer")
        self.defaults = defaults

        if isinstance(params, torch.Tensor):
            raise TypeError("params argument given to the optimizer should be "
                            "an iterable of Tensors or dicts, but got " +
                            torch.typename(params))

        self.state = defaultdict(dict)
        self.param_groups = []

        param_groups = list(params)
        if len(param_groups) == 0:
            raise ValueError("optimizer got an empty parameter list")
        if not isinstance(param_groups[0], dict):
            param_groups = [{'params': param_groups}]

        for param_group in param_groups:
            self.add_param_group(param_group)

三、保存并加载多个模型的参数

这里取两个模型进行说明(Encoder和Decoder)
保存

state = {'Encoder':Encoder.state_dict(),
         'Decoder':Decoder.state_dict()}
torch.save(state, filename) # state为一个字典,filename为保存的文件名称.pth

加载

checkpoint = torch.load(filename)
Encoder.load_state_dict(checkpoint['Encoder']) # 这里checkpoint可以看为字典,和之前保存的state相对应
Decoder.load_state_dict(checkpoint['Decoder'])
  • 7
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一个使用 PyTorch 实现的示例代码,用于训练多个分类器并确保它们的模型在未训练之前具有相同的参数: ```python import torch import torch.nn as nn import torch.optim as optim # 定义基础模型 base_model = nn.Sequential( nn.Linear(10, 20), nn.ReLU(), nn.Linear(20, 2) ) # 保存基础模型的权重 torch.save(base_model.state_dict(), 'base_model.pth') # 加载基础模型的权重,并将其用作初始权重 base_model_weights = torch.load('base_model.pth') model1 = nn.Sequential( nn.Linear(10, 20), nn.ReLU(), nn.Linear(20, 2) ) model1.load_state_dict(base_model_weights) model2 = nn.Sequential( nn.Linear(10, 20), nn.ReLU(), nn.Linear(20, 2) ) model2.load_state_dict(base_model_weights) # 定义损失函数和优化器 criterion = nn.CrossEntropyLoss() optimizer1 = optim.SGD(model1.parameters(), lr=0.1) optimizer2 = optim.SGD(model2.parameters(), lr=0.1) # 定义训练集和标签 train_data = torch.randn(100, 10) train_labels = torch.randint(2, (100,)) # 训练模型1 for epoch in range(10): optimizer1.zero_grad() output = model1(train_data) loss = criterion(output, train_labels) loss.backward() optimizer1.step() # 训练模型2 for epoch in range(10): optimizer2.zero_grad() output = model2(train_data) loss = criterion(output, train_labels) loss.backward() optimizer2.step() # 保存每个分类器的权重 torch.save(model1.state_dict(), 'model1.pth') torch.save(model2.state_dict(), 'model2.pth') ``` 在这个示例中,我们首先定义了一个基础模型 `base_model`,并将其权重保存在文件 `base_model.pth` 中。然后,我们加载这个权重,并将其用作模型1和模型2的初始权重。接下来,我们定义了损失函数和优化器,并使用相同的训练集和标签对每个模型进行了10个训练周期的训练。最后,我们保存了每个分类器的权重,以便以后使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值