首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BERT成批嵌入

BERT成批嵌入
EN

Stack Overflow用户
提问于 2021-02-02 16:09:26
回答 1查看 1.6K关注 0票数 1

我遵循这个职位来提取句子的嵌入,对于单个句子,步骤描述如下:

代码语言:javascript
复制
    text = "After stealing money from the bank vault, the bank robber was seen " \
           "fishing on the Mississippi river bank."
    
    # Add the special tokens. 
    marked_text = "[CLS] " + text + " [SEP]"
    
    # Split the sentence into tokens. 
    tokenized_text = tokenizer.tokenize(marked_text)
    
    # Mark each of the 22 tokens as belonging to sentence "1". 
    segments_ids = [1] * len(tokenized_text)
    
    # Convert inputs to PyTorch tensors 
    tokens_tensor = torch.tensor([indexed_tokens]) 
    segments_tensors = torch.tensor([segments_ids])
    
    # Load pre-trained model (weights) 
    model = BertModel.from_pretrained('bert-base-uncased',
                                 output_hidden_states = True,
                                      )
    
    # Put the model in "evaluation" mode, meaning feed-forward operation. 
    model.eval()
    
    with torch.no_grad():
        outputs = model(tokens_tensor, segments_tensors)
        hidden_states = outputs[2]

我想对一批序列做这个。下面是我的示例代码:

代码语言:javascript
复制
seql = ['this is an example', 'today was sunny and', 'today was']
encoded = [tokenizer.encode(seq, max_length=5, pad_to_max_length=True) for seq in seql]

encoded
[[2, 2511, 1840, 3251, 3], 
 [2, 1663, 2541, 1957, 3], 
 [2, 1663, 2541, 3, 0]]

但是由于我在处理批处理序列需要有相同的长度。因此,我介绍了一个填充标记(第3句),它使我对以下几点感到困惑:

  • pad_token (0)的段id应该是什么?
  • 当我把张量给模型时,我是否应该使用注意掩蔽,以使填充被忽略?在本例中,只使用令牌和分段张量。 outputs = model(tokens_tensor,segments_tensors)
  • 如果我不处理批处理,而是处理单个句子,那么我可能不需要填充标记。与批次相比,这样做更好吗?
EN

回答 1

Stack Overflow用户

发布于 2021-02-02 16:27:29

您可以使用一个函数(填充、截断)完成所有需要的工作。

encode_plus

检查参数:医生们

你可以用一个序列列表做同样的事情

batch_encode_plus

文档

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66013380

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档