transformer库bert的使用(pytorch)

记录一下学习的内容
1.载入bert

from transformers import BertModel, BertTokenizer, BertConfig
#注意文件夹里的配置文件需更名'config',词表更名为'vocab'
model_name = "../bert-base-uncased/"
# 载入tokenizer
tokenizer = BertTokenizer.from_pretrained(model_name)
#载入配置文件,这句可有可无,直接下一步载入模型自动配置
config = BertConfig.from_pretrained(model_name)
# 载入模型
model = BertModel.from_pretrained(model_name)

2.分词+映射

# 输入文本
input_text = "Here is some text to encode"
# 分词+映射,会自动添加[101][102]
input_ids = tokenizer.encode(input_text)
# [101, 2182, 2003, 2070, 3793, 2000, 4372, 16044, 102]
#基于wordpiece的分词
split_text = tokenizer.tokenize(input_text)
#['here', 'is', 'some', 'text', 'to', 'en', '##code'] 

#将分词结果映射到词表的id,不会自动添加[101][102]
index_token = tokenizer.convert_tokens_to_ids(split_text)
# [2182, 2003, 2070, 3793, 2000, 4372, 16044]

3.bert输入
1)input_ids 词表中的位置
2)attention_mask 与最大长度匹配,有内容为1,无内容补0
3)token_type_ids 多个句子时,用于区分第几个句子

4.bert输出

sequence, pooler = model(input_ids_1_tensor)
#sequence层的输出,shape为[batch_size, seq_length, hidden_size]
#pooling层的输出,shape为[batch_size, hidden_size]
#print(sequence.size())     torch.Size([1, 7, 768])
#print(pooler.size())     torch.Size([1, 768])

如果想得到all_hidden_size,需要修改config

#返回所有hidden_states
model_config = BertConfig.from_pretrained(model_name)
model_config.output_hidden_states = True
model = BertModel.from_pretrained(model_name, config=model_config)
vector, pooler, all_hidden_states = model(input_ids_1_tensor)
#print(len(all_hidden_states), all_hidden_states[0].size()) 
#13 torch.Size([1, 7, 768])  这里all_hidden_states返回的是一个tupple

这里存在一个问题,bert-base-uncased是12层,all_hidden_states返回了13个,不是很理解,不过一般只使用最后几层吧,有大佬解惑请留言,感谢。

你可能感兴趣的:(python,自然语言处理)