标签: bert-language-model

在本地下载预训练的句子转换器模型

我正在使用 SentenceTransformers 库(此处: https: //pypi.org/project/sentence-transformers/#pretrained-models)使用预训练模型 bert-base-nli-mean-tokens 创建句子嵌入。我有一个应用程序将部署到无法访问互联网的设备。到这里,已经回答了,如何保存模型下载预训练的BERT模型到本地。然而我一直坚持从本地保存的路径加载保存的模型。

当我尝试使用上述技术保存模型时,这些是输出文件:

('/bert-base-nli-mean-tokens/tokenizer_config.json',
 '/bert-base-nli-mean-tokens/special_tokens_map.json',
 '/bert-base-nli-mean-tokens/vocab.txt',
 '/bert-base-nli-mean-tokens/added_tokens.json')
Run Code Online (Sandbox Code Playgroud)

当我尝试将其加载到内存中时,使用

tokenizer = AutoTokenizer.from_pretrained(to_save_path)
Run Code Online (Sandbox Code Playgroud)

我越来越

Can't load config for '/bert-base-nli-mean-tokens'. Make sure that:

- '/bert-base-nli-mean-tokens' is a correct model identifier listed on 'https://huggingface.co/models'

- or '/bert-base-nli-mean-tokens' is the correct path to a directory containing a config.json 
Run Code Online (Sandbox Code Playgroud)

word-embedding bert-language-model huggingface-tokenizers sentence-transformers

15
推荐指数
2
解决办法
3万
查看次数

在非单一维度 1 处,张量 a (707) 的大小必须与张量 b (512) 的大小匹配

我正在尝试使用预训练的 BERT 模型进行文本分类。我在我的数据集上训练了模型,并在测试阶段;我知道 BERT 只能接受 512 个标记,因此我编写了 if 条件来检查数据帧中测试语句的长度。如果它比 512 长,我将句子分成序列,每个序列有 512 个标记。然后进行分词器编码。序列的长度是 512,但是,在进行 tokenize 编码后,长度变为 707,并且出现此错误。

The size of tensor a (707) must match the size of tensor b (512) at non-singleton dimension 1
Run Code Online (Sandbox Code Playgroud)

这是我用来执行前面步骤的代码:

tokenizer = BertTokenizer.from_pretrained('bert-base-cased', do_lower_case=False)
import math

pred=[]
if (len(test_sentence_in_df.split())>512):
  
  n=math.ceil(len(test_sentence_in_df.split())/512)
  for i in range(n):
    if (i==(n-1)):
      print(i)
      test_sentence=' '.join(test_sentence_in_df.split()[i*512::])
    else:
      print("i in else",str(i))
      test_sentence=' '.join(test_sentence_in_df.split()[i*512:(i+1)*512])
      
      #print(len(test_sentence.split()))  ##here's the length is 512
    tokenized_sentence = tokenizer.encode(test_sentence)
    input_ids = torch.tensor([tokenized_sentence]).cuda()
    print(len(tokenized_sentence)) #### here's the length is 707 …
Run Code Online (Sandbox Code Playgroud)

python tokenize tensorflow pytorch bert-language-model

14
推荐指数
2
解决办法
3万
查看次数

BertForSequenceClassification 与用于句子多类分类的 BertForMultipleChoice

我正在处理文本分类问题(例如情感分析),我需要将文本字符串分类为五个类别之一。

我刚开始在PyTorch 中使用Huggingface Transformer包和 BERT。我需要的是一个顶部带有 softmax 层的分类器,以便我可以进行 5 向分类。令人困惑的是, Transformer 包中似乎有两个相关选项:BertForSequenceClassificationBertForMultipleChoice

我应该使用哪一种来完成我的 5 向分类任务?他们的适当用例是什么?

BertForSequenceClassification的文档根本没有提到 softmax,尽管它确实提到了交叉熵。我不确定这个类是否仅用于 2 类分类(即逻辑回归)。

Bert 模型转换器,顶部带有序列分类/回归头(池化输出顶部的线性层),例如用于 GLUE 任务。

  • 标签(torch.LongTensor of shape (batch_size,), optional, defaults to None)——用于计算序列分类/回归损失的标签。索引应该在 [0, ..., config.num_labels - 1] 中。如果 config.num_labels == 1 计算回归损失(均方损失),如果 config.num_labels > 1 计算分类损失(交叉熵)。

BertForMultipleChoice的文档提到了 softmax,但是从描述标签的方式来看,这个类听起来像是用于多标签分类(即多个标签的二元分类)。

Bert 模型,顶部带有多项选择分类(池化输出顶部的线性层和 softmax),例如用于 RocStories/SWAG 任务。

  • 标签(torch.LongTensor of shape (batch_size,), optional, defaults to None)——用于计算多项选择分类损失的标签。索引应该在 [0, ..., num_choices] 中,其中 num_choices 是输入张量的第二维的大小。

感谢您的任何帮助。

python machine-learning pytorch bert-language-model huggingface-transformers

13
推荐指数
1
解决办法
6617
查看次数

PyTorch:运行时错误:输入、输出和索引必须在当前设备上

我正在火炬上运行 BERT 模型。这是一个多类情感分类任务,大约有 30,000 行。我已经把所有东西都放在了 cuda 上,但不知道为什么会出现以下运行时错误。这是我的代码:

for epoch in tqdm(range(1, epochs+1)):
    
    model.train()
    
    loss_train_total = 0

    progress_bar = tqdm(dataloader_train, desc='Epoch {:1d}'.format(epoch), leave=False, disable=False)
    for batch in progress_bar:

        model.zero_grad()
        
        batch = tuple(b.to(device) for b in batch)
        
        inputs = {'input_ids':      batch[0],
                  'attention_mask': batch[1],
                  'labels':         batch[2],
                 }       

        outputs = model(**inputs)
        
        loss = outputs[0]
        loss_train_total += loss.item()
        loss.backward()

        torch.nn.utils.clip_grad_norm_(model.parameters(), 1.0)

        optimizer.step()
        scheduler.step()
        
        progress_bar.set_postfix({'training_loss': '{:.3f}'.format(loss.item()/len(batch))})
         
        
    torch.save(model.state_dict(), f'finetuned_BERT_epoch_{epoch}.model')
        
    tqdm.write(f'\nEpoch {epoch}')
    
    loss_train_avg = loss_train_total/len(dataloader_train)            
    tqdm.write(f'Training loss: {loss_train_avg}')
    
    val_loss, predictions, true_vals = evaluate(dataloader_validation)
    val_f1 = f1_score_func(predictions, true_vals)
    tqdm.write(f'Validation …
Run Code Online (Sandbox Code Playgroud)

python nlp pytorch bert-language-model

13
推荐指数
1
解决办法
2万
查看次数

如何在 MLM 和 NSP 的新领域从头开始训练 BERT?

我\xe2\x80\x99m 尝试使用我自己的数据集和 HuggingFace 库从头开始训练 BERT 模型。我想以一种与原始 BERT 模型完全相同的架构来训练模型。

\n

在原始论文中,它指出:\xe2\x80\x9cBERT 在两个任务上进行训练:预测随机掩码标记(MLM)和预测两个句子是否相互跟随(NSP)。SCIBERT 遵循与 BERT 相同的架构,但在科学文本上进行了预训练。\xe2\x80\x9d

\n

I\xe2\x80\x99m 试图了解如何在上述两个任务上训练模型。目前,我初始化模型如下:

\n
from transformers import BertForMaskedLM\nmodel = BertForMaskedLM(config=config)\n
Run Code Online (Sandbox Code Playgroud)\n

然而,它仅适用于 MLM,而不适用于 NSP。我怎样才能用 NSP 初始化和训练模型,或者也许我原来的方法就很好?

\n

我的假设是

\n
    \n
  1. 初始化BertForPreTraining(对于 MLM 和 NSP),或者

    \n
  2. \n
  3. 完成训练后BertForMaskedLM,初始化相同的模型并再次训练BertForNextSentencePrediction(但这种方法\xe2\x80\x99s计算和\n资源将花费两倍\xe2\x80\xa6)

    \n
  4. \n
\n

I\xe2\x80\x99m 不确定哪一个是正确的方法。任何见解或建议将不胜感激。

\n

nlp transformer-model deep-learning bert-language-model huggingface-transformers

12
推荐指数
2
解决办法
1万
查看次数

PyTorch BERT 类型错误:forward() 得到了意外的关键字参数“标签”

使用 PyTorch 转换器训练 BERT 模型(遵循此处的教程)。

教程中的以下语句

loss = model(b_input_ids, token_type_ids=None, attention_mask=b_input_mask, labels=b_labels)
Run Code Online (Sandbox Code Playgroud)

造成

TypeError: forward() got an unexpected keyword argument 'labels'
Run Code Online (Sandbox Code Playgroud)

这是完整的错误,

TypeError                                 Traceback (most recent call last)
<ipython-input-53-56aa2f57dcaf> in <module>
     26         optimizer.zero_grad()
     27         # Forward pass
---> 28         loss = model(b_input_ids, token_type_ids=None, attention_mask=b_input_mask, labels=b_labels)
     29         train_loss_set.append(loss.item())
     30         # Backward pass

~/anaconda3/envs/systreviewclassifi/lib/python3.6/site-packages/torch/nn/modules/module.py in __call__(self, *input, **kwargs)
    539             result = self._slow_forward(*input, **kwargs)
    540         else:
--> 541             result = self.forward(*input, **kwargs)
    542         for hook in self._forward_hooks.values():
    543             hook_result = hook(self, …
Run Code Online (Sandbox Code Playgroud)

python pytorch bert-language-model huggingface-transformers

11
推荐指数
1
解决办法
2万
查看次数

OSError:错误没有名为['pytorch_model.bin','tf_model.h5','model.ckpt.index']的文件

当我在线加载 BERT 预训练模型时,出现此错误,OSError: Error no file named ['pytorch_model.bin', 'tf_model.h5', 'model.ckpt.index'] found in directory uncased_L-12_H-768_A-12 or 'from_tf' set to False我该怎么办?

python tensorflow pytorch bert-language-model

11
推荐指数
1
解决办法
3万
查看次数

“自注意力机制”和“全连接”层有什么区别?

我对这两种结构感到困惑。理论上,它们的输出都与其输入相关。是什么魔力让“自注意力机制”比全连接层更强大?

transformer-model pytorch bert-language-model

11
推荐指数
1
解决办法
2281
查看次数

具有 dropout 设置的 Transformers 预训练模型

我正在尝试使用 Transformer 的 Huggingface 预训练模型bert-base-uncased,但我想增加 dropout。方法中没有提到这一点from_pretrained,但 colab 运行下面的对象实例化没有任何问题。我在classtransformers.BertConfig文档中看到了这些 dropout 参数。

我是否使用 bert-base-uncased 并以正确的方式改变 dropout ?

model = BertForSequenceClassification.from_pretrained(
        pretrained_model_name_or_path='bert-base-uncased',
        num_labels=2,
        output_attentions = False,
        output_hidden_states = False,
        attention_probs_dropout_prob=0.5,
        hidden_dropout_prob=0.5
    )
Run Code Online (Sandbox Code Playgroud)

python bert-language-model huggingface-transformers

11
推荐指数
2
解决办法
1万
查看次数

特殊代币有什么特别之处?

“令牌”和“特殊令牌”到底有什么区别?

\n

我了解以下内容:

\n
    \n
  • 什么是典型的代币
  • \n
  • 什么是典型的特殊代币:MASK、UNK、SEP等
  • \n
  • 你什么时候添加一个标记(当你想扩展你的词汇量时)
  • \n
\n

我不明白的是,您想要在什么样的容量下创建新的特殊令牌,我们需要它的任何示例以及何时想要创建除默认特殊令牌之外的特殊令牌?如果一个示例使用特殊令牌,为什么普通令牌不能实现相同的目标?

\n
tokenizer.add_tokens(['[EOT]'], special_tokens=True)\n
Run Code Online (Sandbox Code Playgroud)\n

而且我也不太明白源文档中的以下描述。\n如果我们将 add_special_tokens 设置为 False,这对我们的模型有什么区别?

\n
add_special_tokens (bool, optional, defaults to True) \xe2\x80\x94 Whether or not to encode the sequences with the special tokens relative to their model.\n
Run Code Online (Sandbox Code Playgroud)\n

nlp tokenize bert-language-model huggingface-transformers huggingface-tokenizers

11
推荐指数
1
解决办法
5322
查看次数