带有PyTorch Overflower的Flair框架错误:int太大,无法转换

2024-04-18 12:29:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用Flair框架(https://github.com/flairNLP/flair)训练一个命名实体识别模型,其中嵌入:TransformerWordEmbeddings('emilyalsentzer/Bio_ClinicalBERT')。但是,它总是以OverflowError: int too big to convert失败。这也发生在其他一些转换器字嵌入中,例如XLNet。然而,BERTRoBERTa工作正常

以下是错误的完整回溯:

2021-04-15 09:34:48,106 ----------------------------------------------------------------------------------------------------
2021-04-15 09:34:48,106 Corpus: "Corpus: 778 train + 259 dev + 260 test sentences"
2021-04-15 09:34:48,106 ----------------------------------------------------------------------------------------------------
2021-04-15 09:34:48,106 Parameters:
2021-04-15 09:34:48,106  - learning_rate: "0.1"
2021-04-15 09:34:48,106  - mini_batch_size: "32"
2021-04-15 09:34:48,106  - patience: "3"
2021-04-15 09:34:48,106  - anneal_factor: "0.5"
2021-04-15 09:34:48,106  - max_epochs: "200"
2021-04-15 09:34:48,106  - shuffle: "True"
2021-04-15 09:34:48,106  - train_with_dev: "False"
2021-04-15 09:34:48,106  - batch_growth_annealing: "False"
2021-04-15 09:34:48,107 ----------------------------------------------------------------------------------------------------
2021-04-15 09:34:48,107 Model training base path: "/home/xxx/data/xxx-clinical-bert"
2021-04-15 09:34:48,107 ----------------------------------------------------------------------------------------------------
2021-04-15 09:34:48,107 Device: cuda:0
2021-04-15 09:34:48,107 ----------------------------------------------------------------------------------------------------
2021-04-15 09:34:48,107 Embeddings storage mode: gpu
2021-04-15 09:34:48,116 ----------------------------------------------------------------------------------------------------
Traceback (most recent call last):
  File "train_medical_2.py", line 144, in <module>
    train_ner(d + '-base-ent',corpus_base)
  File "train_medical_2.py", line 136, in train_ner
    max_epochs=200)
  File "/home/d111199102201607101/flair/lib/python3.6/site-packages/flair/trainers/trainer.py", line 381, in train
    loss = self.model.forward_loss(batch_step)
  File "/home/d111199102201607101/flair/lib/python3.6/site-packages/flair/models/sequence_tagger_model.py", line 637, in forward_loss
    features = self.forward(data_points)
  File "/home/d111199102201607101/flair/lib/python3.6/site-packages/flair/models/sequence_tagger_model.py", line 642, in forward
    self.embeddings.embed(sentences)
  File "/home/d111199102201607101/flair/lib/python3.6/site-packages/flair/embeddings/token.py", line 81, in embed
    embedding.embed(sentences)
  File "/home/d111199102201607101/flair/lib/python3.6/site-packages/flair/embeddings/base.py", line 60, in embed
    self._add_embeddings_internal(sentences)
  File "/home/d111199102201607101/flair/lib/python3.6/site-packages/flair/embeddings/token.py", line 923, in _add_embeddings_internal
    self._add_embeddings_to_sentence(sentence)
  File "/home/d111199102201607101/flair/lib/python3.6/site-packages/flair/embeddings/token.py", line 999, in _add_embeddings_to_sentence
    truncation=True,
  File "/home/d111199102201607101/flair/lib/python3.6/site-packages/transformers/tokenization_utils_base.py", line 2438, in encode_plus
    **kwargs,
  File "/home/d111199102201607101/flair/lib/python3.6/site-packages/transformers/tokenization_utils_fast.py", line 472, in _encode_plus
    **kwargs,
  File "/home/d111199102201607101/flair/lib/python3.6/site-packages/transformers/tokenization_utils_fast.py", line 379, in _batch_encode_plus
    pad_to_multiple_of=pad_to_multiple_of,
  File "/home/d111199102201607101/flair/lib/python3.6/site-packages/transformers/tokenization_utils_fast.py", line 330, in set_truncation_and_padding
    self._tokenizer.enable_truncation(max_length, stride=stride, strategy=truncation_strategy.value)
OverflowError: int too big to convert

我已尝试更改embedding_storage_modehidden_sizemini_batch_size。所有这些都不能解决这个问题

有人有同样的问题吗? 有没有办法解决这个问题

谢谢


Tags: toinpyselfhomelibpackagesbatch
3条回答

在局部变量声明中使用的类型(如在ArrayList中) 例)通常没有那么重要。你只需要确保 myList(名称“myList”左边的单词)的类型 要比任何方法参数的类型更具体 我的名单

考虑:

ArrayList words = new ArrayList();
sort(words);
removeNames(words);

public void sort(Collection c)  ... blah blah blah

public void removeNames(List words) ...  

我本可以将“单词”的类型替换为列表。事实并非如此 对我的程序的可读性或行为有任何影响。 不过,我无法将“词语”定义为对象。这太笼统了

另一方面,当你定义一个公共方法时,你应该给出 仔细考虑方法参数的类型,因为 这对调用者可以传递的内容有直接影响。如果我定义 分类不同:

ArrayList words = new ArrayList();

// this line will cause a compilation error.
sort(words);

public void sort(LinkedList c)  ... blah blah blah

排序的定义现在非常严格。在第一个例子中, 排序方法允许任何对象作为参数,只要 实现集合。在第二个示例中,sort只允许 LinkedList,它不会接受任何其他内容(ArrayList、HashSet、, 树集和许多其他)。排序方法可以使用的场景 现在使用的设备相当有限。这可能是有充分理由的;这个 排序的实现可能依赖于LinkedList的一个功能 数据结构。如果人们使用 这段代码需要一个排序算法,该算法适用于除 链接列表

编写java库的主要技巧之一是确定类型 方法参数的选择。你想成为什么样的将军

arraylist的大小是动态的。集合没有编译时检查,它必须是强制类型化的。集合仅包含引用对象。你可以把收藏想象成一个“袋子”。操纵可以在整个对象上执行。我还确信,与ArrayList相比,对一个集合的搜索时间很短,但不是正面的。ArrayList有更多可以调用的功能和方法

写作可能更常见 List<Something> myList = new ArrayList<Something>();而不是使用Collection。通常,列表的某些方面是重要的。在接受重复元素方面Collection的模糊性,无论其下面是一个集合或列表(或其他什么),都可能是一种痛苦

除此之外,主要目的是抽象,或实现独立性。我真的在乎我的列表是ArrayList还是Vector?大多数时候可能不会。如果我的代码使用最通用的接口来表达我需要对象做什么,那么它会更灵活

简单的例子是,假设您编写一个使用所有ArrayList的程序,然后它需要支持多个用户,因此为了线程安全,您希望将所有ArrayList更改为Vecto。如果您一直在传递对类型ArrayList的引用,则必须在任何地方更改每个用法。如果一直在传递对类型List的引用,只需更改创建它们的位置

此外,有时实现类可能不是您可以或不想导入和使用的东西。例如,在使用hibernate之类的持久性提供程序时,实现Set接口的实际类可以是框架特有的高度专业化的自定义实现,也可以是普通的HashSet,具体取决于对象的创建方式。你不在乎差异,这对你来说只是个Set

相关问题 更多 >