pytorch训练后如何把模型应用并输出预测结果?

现在我用pytorch进行一个回归任务(中间包含图卷积神经网络和一维卷积网络,然后一个全连接层进行回归预测),训练后想保存效果最好的那一次的模型,然后应用到其他数据上,输出其他数据预测出来的结果(结果应该是连续的数值),想请教这要怎么做呢?有人可以提供帮助吗

该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
在 PyTorch 中,可以使用 torch.save() 函数将训练好的模型保存到硬盘上,以便后续使用。具体来说,可以在训练循环中记录最好的模型,并将其保存到文件中。代码如下:

import torch

# 训练代码...

# 保存效果最好的模型
best_model = model.state_dict()
torch.save(best_model, "best_model.pth")

在需要使用模型进行预测的时候,可以使用 torch.load() 函数将保存的模型加载回来,并将待预测的数据输入模型中,得到输出结果。具体来说,可以先定义模型,然后使用 torch.load() 函数加载保存的模型,最后将待预测的数据输入模型中,得到输出结果。代码如下:

import torch

# 定义模型
model = MyModel()
model.eval()

# 加载保存的模型
model.load_state_dict(torch.load("best_model.pth"))

# 输入待预测的数据并输出预测结果
with torch.no_grad():
    x = torch.tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9]], dtype=torch.float32)
    y_pred = model(x)
    print(y_pred)

在上述代码中,MyModel() 表示定义的模型类,model.eval() 表示将模型设置为评估模式,torch.no_grad() 表示在计算图中不需要计算梯度,在进行预测时可以提高运行效率。其中,x 表示待预测的数据,y_pred 表示模型输出的预测结果。

需要注意的是,模型的输入数据形状应该与模型定义时的输入形状一致,模型输出的结果是一个张量,需要根据具体的问题进行解释。


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7612765
  • 这篇博客也不错, 你可以看下Pytorch 加载预训练模型,固定部分模型微调,但是固定部分输出结果不同的原因
  • 你还可以看下pytorch参考手册中的 pytorch 使用PyTorch进行培训
  • 除此之外, 这篇博客: 【Pytorch】网络结构与预训练模型的网络结构是否一致的情况下:手动加载预训练模型、网络结构与模型参数匹配中的 网络结构不一致 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 这里模型使用Pytorch提供的ResNet101作为backbone,而预训练模型的backbone为ResNet50。

    import torch
    import torchvision.models
    from torch import nn
    from collections import OrderedDict
    
    
    model = torchvision.models.resnet101(pretrained=False)    # Pytorch提供的网络结构,不加载官方预训练模型(ImageNet)
    fc_features = model.fc.in_features         # 提取fc层中固定的参数
    model.fc = nn.Linear(fc_features, 51)     # 修改为自己项目的类别数量(也即预训练模型的类别数)
    

    与之前同理,首先观察网络层名有什么差异,然后更改层名使其一致,这里由于网络结构不同,所以只将ResNet101与ResNet50中都有的层名用预训练权重参数赋值。代码如下:

    # 更改预训练模型的层名,使其匹配models.py中定义的base_model网络层名
    new_state_dict = OrderedDict()
    for k, v in pretrained_model['state_dict'].items():
        name = 'module.base_model.' + k[9:]  # 更改conv1.weight等层名的前缀
        new_state_dict[name] = v
    
    pretrained_dict = {k: v for k, v in new_state_dict.items() if k in model_dict}
    # 更新现有的model_dict
    model_dict = model.state_dict()
    model_dict.update(pretrained_dict)
    # 加载我们真正需要的state_dict
    model.load_state_dict(model_dict)
    

  • 您还可以看一下 日月光华老师的PyTorch深度学习简明教程课程中的 模型训练与结果可视化小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    针对问题描述,需要将PyTorch训练完的模型保存,并在新数据上进行预测输出。具体步骤如下:

    Step 1:保存最好的模型

    在训练过程中,可以设置一个变量记录最好的模型,一旦有更好的模型就更新该变量。代码如下:

    # 在训练过程中记录最好的模型
    best_loss = float('inf')
    for epoch in range(num_epochs):
        train_loss = train(model, train_loader, optimizer, criterion, device)
        val_loss = validate(model, val_loader, criterion, device)
        if val_loss < best_loss:
            best_loss = val_loss
            torch.save(model.state_dict(), 'best_model.pt')
        print(f'Epoch: {epoch+1}/{num_epochs}, Train Loss: {train_loss:.4f}, Val Loss: {val_loss:.4f}, Best Loss: {best_loss:.4f}')
    

    这里使用了一个best_loss变量记录最好的模型参数,如果有更好的模型则更新best_loss,并将模型参数保存在best_model.pt文件中。

    Step 2:载入保存好的模型

    在新数据上进行预测需要载入已经保存好的模型参数,代码如下:

    # 创建模型实例
    model = MyModel()
    # 载入之前训练好的最佳模型参数
    model.load_state_dict(torch.load('best_model.pt'))
    

    这里假设MyModel是你自己定义的网络模型。

    Step 3:进行预测

    在载入模型参数后,即可使用模型进行预测,代码如下:

    # 将模型设置为评估模式
    model.eval()
    # 使用模型预测新数据
    with torch.no_grad():
        y_pred = model(x_new)
    

    这里需要将模型设置为评估模式,使用no_grad()上下文管理器,不保存梯度,避免出现不必要的计算。同时,x_new代表新的数据输入。

    至此,已经实现了在PyTorch中训练完模型后将其应用于新数据并输出预测结果的过程。