如何从pytorch预训练的微调模型中提取特征

时间:2019-10-17 03:44:50

标签: machine-learning pytorch

我需要从预训练的(微调)BERT模型中提取特征。

我使用拥抱面变压器在Pytorch中微调了预训练的BERT模型。所有的训练/验证都是在云中的GPU上完成的。

在培训结束时,我将模型和令牌生成器保存如下:

best_model.save_pretrained('./saved_model/')
tokenizer.save_pretrained('./saved_model/')

这将在saved_model目录中创建以下文件:

config.json
added_token.json
special_tokens_map.json
tokenizer_config.json
vocab.txt
pytorch_model.bin

我将saved_model目录保存在计算机中,并按如下所示加载modeltokenizer

model = torch.load('./saved_model/pytorch_model.bin',map_location=torch.device('cpu'))
tokenizer = BertTokenizer.from_pretrained('./saved_model/')

现在要提取特征,我在下面做

input_ids = torch.tensor([tokenizer.encode("Here is some text to encode", add_special_tokens=True)])
last_hidden_states = model(input_ids)[0][0]

但是对于最后一行,它会向我抛出错误TypeError: 'collections.OrderedDict' object is not callable

似乎我没有正确加载模型。我认为我的model=torch.load(....)行不是在加载整个模型,而是在加载有序字典。

我在这里想念什么?我什至以正确的方式保存模型吗?请提出建议。

1 个答案:

答案 0 :(得分:1)

torch.load()返回一个collections.OrderedDict对象。检出recommended way,以保存和加载模型的状态字典。

保存

torch.save(model.state_dict(), PATH)

加载

model = TheModelClass(*args, **kwargs)
model.load_state_dict(torch.load(PATH))
model.eval()

因此,在您的情况下,应该是:

model = BertModel(config)
model.load_state_dict('./saved_model/pytorch_model.bin',
                       map_location=torch.device('cpu'))
model.eval() # to disable dropouts
相关问题