Python 如何在其他地方使用伯特预训练模型?

Python 如何在其他地方使用伯特预训练模型?,python,tensorflow,pytorch,pre-trained-model,bert-language-model,Python,Tensorflow,Pytorch,Pre Trained Model,Bert Language Model,我学习了这门课程,为情绪分析建立了一个预训练的模型。在trining期间,在每个历元,他们使用torch.save(model.state_dict(),f'BERT_ft_epoch{epoch}.model')保存模型。现在我想在其他地方使用这些模型中的一个(显然是最好的),例如,用户可以粘贴一条tweet作为输入,并获得作者的情感。但我不知道如何加载模型和预测,以下是我尝试的: import torchvision.models as models import torch model

我学习了这门课程,为情绪分析建立了一个预训练的模型。在trining期间,在每个历元,他们使用
torch.save(model.state_dict(),f'BERT_ft_epoch{epoch}.model')
保存模型。现在我想在其他地方使用这些模型中的一个(显然是最好的),例如,用户可以粘贴一条tweet作为输入,并获得作者的情感。但我不知道如何加载模型和预测,以下是我尝试的:

import torchvision.models as models
import torch

model = models.resnet101(pretrained=False)
model.load_state_dict(torch.load('Models/BERT_ft_epoch15.model'), strict=False)
model_ft.eval()
output = model_ft(input) #input is a tweets list

我得到了这个错误:
TypeError:conv2d():参数“input”(位置1)必须是张量,而不是list
resnet101和
BERT
是两个完全不同的模型。您无法将预训练的BERT模型加载到resnet中。

resnet101
BERT
是两个完全不同的模型。您无法将预训练的BERT模型加载到resnet中。

如何使用Pytorch定义、初始化、保存和加载模型

初始化模型。继承了类<代码> NN。模块< /代码>,考虑简单的两层模型:

import torch
import torch.nn as nn

class Model(nn.Module)
    def __init__(self, input_size=128, output_size=10):
        super(Model).__init__()
    
        self.layer1 = nn.Sequetial(nn.Linear(input_size, 64), nn.LeakyReLU())
        self.layer2 = nn.Linear(64, output_size)
    
    def forward(self, x):
        y = self.layer2(self.layer1(x))
        return y
模型的层首先在
\uuuu init\uuuu()
处初始化,然后在
forward()
中指定向前传递的操作。你可以在这里发挥创意,只要记住使用pytorch可微运算

通过创建新类的实例来初始化模型:

model = Model() # brand new instance!
培训模型后,您希望保存它:

import torch
model = Model(128, 10) # initialization

torch.save(model.state_dict, 'model.pt') # saving state dict
您不是在这里保存模型,而是在保存
状态_dict
这是一个有序字典,包含模型的所有权重、偏差和其他参数。我们保存
状态而不是直接保存模型的原因可以在文档()中找到。现在,只考虑最好的练习。< /P>
最后,我们得出如何加载模型。您必须首先初始化模型,然后从磁盘加载
状态

model = Model(128, 10) # model initialization
model.load_state_dict('model.pt')
model.eval() # put the model in inference mode
请注意,当我们保存
state_dict
时,我们还可以保存用于反向传播的优化器和图形。这有助于检查培训并在稍后阶段恢复培训

    # in the training loop
    torch.save({"epoch": epoch,
                "model": model.state_dict,
                "optim": optim.state_dict,
                "loss": loss}, f'checkpoint{epoch}.pt')

我希望这为您描绘了一幅清晰的画面=)

如何使用Pytorch定义、初始化、保存和加载模型

初始化模型。继承了类<代码> NN。模块< /代码>,考虑简单的两层模型:

import torch
import torch.nn as nn

class Model(nn.Module)
    def __init__(self, input_size=128, output_size=10):
        super(Model).__init__()
    
        self.layer1 = nn.Sequetial(nn.Linear(input_size, 64), nn.LeakyReLU())
        self.layer2 = nn.Linear(64, output_size)
    
    def forward(self, x):
        y = self.layer2(self.layer1(x))
        return y
模型的层首先在
\uuuu init\uuuu()
处初始化,然后在
forward()
中指定向前传递的操作。你可以在这里发挥创意,只要记住使用pytorch可微运算

通过创建新类的实例来初始化模型:

model = Model() # brand new instance!
培训模型后,您希望保存它:

import torch
model = Model(128, 10) # initialization

torch.save(model.state_dict, 'model.pt') # saving state dict
您不是在这里保存模型,而是在保存
状态_dict
这是一个有序字典,包含模型的所有权重、偏差和其他参数。我们保存
状态而不是直接保存模型的原因可以在文档()中找到。现在,只考虑最好的练习。< /P>
最后,我们得出如何加载模型。您必须首先初始化模型,然后从磁盘加载
状态

model = Model(128, 10) # model initialization
model.load_state_dict('model.pt')
model.eval() # put the model in inference mode
请注意,当我们保存
state_dict
时,我们还可以保存用于反向传播的优化器和图形。这有助于检查培训并在稍后阶段恢复培训

    # in the training loop
    torch.save({"epoch": epoch,
                "model": model.state_dict,
                "optim": optim.state_dict,
                "loss": loss}, f'checkpoint{epoch}.pt')

我希望为您绘制一幅清晰的画面=)

您需要处理您的
输入
,以匹配您正在使用的模型的输入。你有一张单子。我假设这是一个tweet列表(字符串),但您的模型需要输入为张量。我建议您看看这里:,简而言之,必须加载并初始化同一类型的模型。感谢您的回答@VictorZuanazzi,我检查了它,发现:
model=themodel类(*args,**kwargs)model.load_state_dict(torch.load(PATH))model.eval()。看看这里的笔记本@VictorZuanazzi我尝试了这个
model=torch.load('Models/BERT\ft\u epoch15.model')model.eval()
,得到了这个错误
AttributeError:'collections.OrderedDict'对象没有属性“eval”
@Asma,保存的是一个(有序的)字典,其中包含BERT的权重。必须初始化模型并在初始化模型中加载权重。我建议您阅读本教程以了解这些差异。您需要处理
输入
,以匹配所使用模型的输入。你有一张单子。我假设这是一个tweet列表(字符串),但您的模型需要输入为张量。我建议您看看这里:,简而言之,必须加载并初始化同一类型的模型。感谢您的回答@VictorZuanazzi,我检查了它,发现:
model=themodel类(*args,**kwargs)model.load_state_dict(torch.load(PATH))model.eval()。看看这里的笔记本@VictorZuanazzi我尝试了这个
model=torch.load('Models/BERT\ft\u epoch15.model')model.eval()
,得到了这个错误
AttributeError:'collections.OrderedDict'对象没有属性“eval”
@Asma,保存的是一个(有序的)字典,其中包含BERT的权重。必须初始化模型并在初始化模型中加载权重。我建议您阅读本教程以了解这些差异。感谢您提供的详细答案,还有一个问题:如何预测新tweet的输出?我应该在forward方法中提出什么?这取决于你是如何进行预测的。forward方法只是实现在输出中转换输入所必须采取的步骤。具体的步骤将取决于你的模型和算法。