我需要从预训练的(微调)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
目录保存在计算机中,并按如下所示加载model
和tokenizer
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(....)
行不是在加载整个模型,而是在加载有序字典。
我在这里想念什么?我什至以正确的方式保存模型吗?请提出建议。
答案 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