【问题标题】:How to load a pre-trained PyTorch model?如何加载预训练的 PyTorch 模型?
【发布时间】:2021-07-16 05:52:23
【问题描述】:

我正在关注this 保存和加载检查点的指南。但是,有些不对劲。我的模型将进行训练,并且参数将在训练阶段正确更新。但是,当我加载检查点时似乎有问题。即参数不再更新。

我的模特:

import torch
import torch.nn as nn
import torch.optim as optim

PATH = 'test.pt'

class model(nn.Module): 
        def __init__(self):
            super(model, self).__init__()
            self.a = torch.nn.Parameter(torch.rand(1, requires_grad=True))
            self.b = torch.nn.Parameter(torch.rand(1, requires_grad=True))
            self.c = torch.nn.Parameter(torch.rand(1, requires_grad=True))
            #print(self.a, self.b, self.c)

        def load(self):
          try:
            checkpoint = torch.load(PATH)  
            print('\nloading pre-trained model...')
            self.a = checkpoint['a']
            self.b = checkpoint['b']
            self.c = checkpoint['c']
            optimizer.load_state_dict(checkpoint['optimizer_state_dict'])
            print(self.a, self.b, self.c)
          except: #file doesn't exist yet
            pass

        @property
        def b_opt(self):
            return torch.tanh(self.b)*2

        def train(self):
          print('training...')
          for epoch in range(3):
            print(self.a, self.b, self.c)
            for r in range(5):
              optimizer.zero_grad()
              loss = torch.square(5 * (r > 2) * (3) - model_net.a * torch.sigmoid((r - model_net.b)) * (model_net.c))
              loss.backward(retain_graph=True) #accumulate gradients

            #checkpoint save
            torch.save({
                'model': model_net.state_dict(),
                'a': model_net.a,
                'b': model_net.b,
                'c': model_net.c,
                'optimizer_state_dict': optimizer.state_dict(),
                }, PATH)

            
            optimizer.step() 
          


model_net = model()
optimizer = optim.Adam(model_net.parameters(), lr = 0.1)


print(model_net.a)
print(model_net.b)
print(model_net.c)

打印出来

Parameter containing:
tensor([0.4214], requires_grad=True)
Parameter containing:
tensor([0.3862], requires_grad=True)
Parameter containing:
tensor([0.8812], requires_grad=True)

然后我运行model_net.train() 以查看参数正在更新并且输出:

training...
Parameter containing:
tensor([0.9990], requires_grad=True) Parameter containing:
tensor([0.1580], requires_grad=True) Parameter containing:
tensor([0.1517], requires_grad=True)
Parameter containing:
tensor([1.0990], requires_grad=True) Parameter containing:
tensor([0.0580], requires_grad=True) Parameter containing:
tensor([0.2517], requires_grad=True)
Parameter containing:
tensor([1.1974], requires_grad=True) Parameter containing:
tensor([-0.0404], requires_grad=True) Parameter containing:
tensor([0.3518], requires_grad=True)

运行model_net.load() 输出:

loading pre-trained model...
Parameter containing:
tensor([1.1974], requires_grad=True) Parameter containing:
tensor([-0.0404], requires_grad=True) Parameter containing:
tensor([0.3518], requires_grad=True)

最后,再次运行 model_net.train() 输出:

training...
Parameter containing:
tensor([1.1974], requires_grad=True) Parameter containing:
tensor([-0.0404], requires_grad=True) Parameter containing:
tensor([0.3518], requires_grad=True)
Parameter containing:
tensor([1.1974], requires_grad=True) Parameter containing:
tensor([-0.0404], requires_grad=True) Parameter containing:
tensor([0.3518], requires_grad=True)
Parameter containing:
tensor([1.1974], requires_grad=True) Parameter containing:
tensor([-0.0404], requires_grad=True) Parameter containing:
tensor([0.3518], requires_grad=True)

更新 1。
根据@jhso 的建议,我将负载更改为:

def load(self):
  try:
    checkpoint = torch.load(PATH)  
    print('\nloading pre-trained model...')
    self.load_state_dict(checkpoint['model'])
    self.optimizer.load_state_dict(checkpoint['optimizer_state_dict'])
    print(self.a, self.b, self.c)
  except: #file doesn't exist yet
    pass

这似乎几乎可以工作(网络现在正在训练),但我认为优化器没有正确加载。那是因为它没有通过self.optimizer.load_state_dict(checkpoint['optimizer_state_dict'])这一行。
你可以看到,因为我运行时它没有print(self.a, self.b, self.c)

model_net.load()

【问题讨论】:

    标签: python pytorch


    【解决方案1】:

    您加载数据的方式不是加载参数的推荐方式,因为您正在覆盖图形连接(或类似的东西......)。你甚至保存了模型 state_dict,所以为什么不使用它!

    我把加载函数改成:

    def load(self):
          try:
            checkpoint = torch.load(PATH)  
            print('\nloading pre-trained model...')
            self.load_state_dict(checkpoint['model'])
            self.optimizer.load_state_dict(checkpoint['optimizer_state_dict'])
            print(self.a, self.b, self.c)
            self.train()
          except: #file doesn't exist yet
            pass
    

    但请注意,要做到这一点,您必须将优化器添加到模型中:

    model_net = model()
    optimizer = optim.Adam(model_net.parameters(), lr = 0.1)
    model_net.optimizer = optimizer
    

    然后给出输出(运行中的火车、负载、火车):

    Parameter containing:
    tensor([0.2316], requires_grad=True) Parameter containing:
    tensor([0.4561], requires_grad=True) Parameter containing:
    tensor([0.8626], requires_grad=True)
    Parameter containing:
    tensor([0.3316], requires_grad=True) Parameter containing:
    tensor([0.3561], requires_grad=True) Parameter containing:
    tensor([0.9626], requires_grad=True)
    Parameter containing:
    tensor([0.4317], requires_grad=True) Parameter containing:
    tensor([0.2568], requires_grad=True) Parameter containing:
    tensor([1.0620], requires_grad=True)
    
    loading pre-trained model...
    Parameter containing:
    tensor([0.4317], requires_grad=True) Parameter containing:
    tensor([0.2568], requires_grad=True) Parameter containing:
    tensor([1.0620], requires_grad=True)
    training...
    Parameter containing:
    tensor([0.4317], requires_grad=True) Parameter containing:
    tensor([0.2568], requires_grad=True) Parameter containing:
    tensor([1.0620], requires_grad=True)
    Parameter containing:
    tensor([0.5321], requires_grad=True) Parameter containing:
    tensor([0.1577], requires_grad=True) Parameter containing:
    tensor([1.1612], requires_grad=True)
    Parameter containing:
    tensor([0.6328], requires_grad=True) Parameter containing:
    tensor([0.0583], requires_grad=True) Parameter containing:
    tensor([1.2606], requires_grad=True)
    

    【讨论】:

    • 感谢您的帮助!请看我的更新。这似乎几乎可以工作!
    • 看我的笔记:注意我将你的优化器添加到类中......
    • model_net = model(); optimizer = optim.Adam(model_net.parameters(), lr = 0.1); model_net.optimizer = optimizer
    • 您是否可以编辑并添加完整的代码以确保我没有遗漏任何内容?
    • 抱歉,一开始就应该这样做。现在完成。
    猜你喜欢
    • 2021-04-05
    • 2020-07-27
    • 2020-02-07
    • 2019-07-17
    • 2019-09-09
    • 1970-01-01
    • 2019-09-11
    • 2018-02-20
    • 1970-01-01
    相关资源
    最近更新 更多