bert源码学习

导入bert模块:

from transformers import BertTokenizer

tokenizer = BertTokenizer.from_pretrained('./bert_pretrain')

其中bert_pretrain中需要的文件有以下三个(其中config文件可以不用下载):

下载地址:https://huggingface.co/bert-base-uncased/tree/main
在这里插入图片描述
下面就是一些基本的操作:

sequence = "A Titan RTX has 24GB of VRAM"
sq1 = "你在干嘛"
sq2 = "我在看电视"
sq3 = "对方有没有动手"
sq4 = "我也不太清楚,有点懵逼"
tokenizer.tokenize()
pad_seq_12 = tokenizer([sq1, sq2], padding=True)
seq_1234 = tokenizer(sq3, sq4)
decode_seq = tokenizer.decode(seq_1234['input_ids'])

print("sq1的padding序列:{}".format(pad_seq_12['input_ids'][0]))
print("sq2的padding序列:{}".format(pad_seq_12['input_ids'][1]))

# attention mask其中的1是需要注意的,0是通过padding操作补全的
print("sq1的attention mask:{}".format(pad_seq_12["attention_mask"][0]))
print("sq1的attention mask:{}".format(pad_seq_12["attention_mask"][1]))

print(seq_1234)

结果展示:
在这里插入图片描述
可以看到输出的序列比原始句子长了一些,比如说有101,102这些id,他是在前后加了CLS、SEP等分隔符,用于确定不同的句子。

token_type_ids表示的是哪些属于第一个句子,哪些属于第二个句子或者哪些属于padding
input_ids表示句子转成vocab中的序号
attention_mask中1是需要计算机注意的,0是因为padding操作或其余不重要的内容

这是将input_ids转码后的输出:

seq_1234 = tokenizer(sq3, sq4)
decode_seq = tokenizer.decode(seq_1234['input_ids'])
print(decode_seq)

pad_seq_12 = tokenizer([sq1, sq2,sq3,sq4], padding=True)
for i in range(4):
    res = tokenizer.decode(pad_seq_12['input_ids'][i])
    print(res)

在这里插入图片描述
BertEmbeddings类:

self.word_embeddings = nn.Embedding(config.vocab_size, config.hidden_size, padding_idx=config.pad_token_id)
# config.vocab_size 代表词库的长度,config.hidden_size代表每个词经过embedding后的长度,
# config.pad_token_id给定了,则在id位置上的词的不参与梯度缩减

self.position_embeddings = nn.Embedding(config.max_position_embeddings, config.hidden_size)
# config.max_position_embeddings表示最大的位置有多长,也即所有句子中最长的长度,这里的位置编码是随机学习到的

self.token_type_embeddings = nn.Embedding(config.type_vocab_size, config.hidden_size)
# config.type_vocab_size用于区别不同的句子
# config.hidden_siz都是用来表示经过embedding之后的长度

self.LayerNorm = nn.LayerNorm(config.hidden_size, eps=config.layer_norm_eps)
# 所有的句子都被转换成维度为hidden_size的大小,经过一个larernorm层进行一个归一化
# batchnorm是对同一特征的所有batch的所有样本进行归一化,Layernorm是把同一个batch的所有样本所有特征进行归一化

self.dropout = nn.Dropout(config.hidden_dropout_prob)
# hidden_dropout_prob每个神经元有这么多概率不被激活,防止过拟合
# 这一系列操作之后输出的形状为(batch,sentence_lenth,hidden_size)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值