【问题标题】:Hugging face: tokenizer for masked lm question拥抱脸:蒙面 lm 问题的标记器
【发布时间】:2020-10-26 16:17:25
【问题描述】:

我正在为我的项目使用 3.0.0 版本的转换器并且有一些问题。

我想对蛋白质序列使用带有掩码 lm 预训练的 bert 模型。 为了获得我从 BertTokenizer 派生的字符级标记器

from transformers import BertTokenizer
class DerivedBertTok(BertTokenizer):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
    def tokenize(self, text):
        if isinstance(text, np.ndarray):
            assert len(text) == 1
            text = text[0]
        return [x if x in self.vocab else self.unk_token for x in text]

我的词汇是这样的

[PAD]
[CLS]
[SEP]
[UNK]
[MASK]
A
R
N
D
B
C
E
Q
Z
G
H
I
L
K
M
F
P
S
T
W
Y
V

用法似乎与我在文档中看到的非常相似:

d_tokenizer = DerivedBertTok(
    vocab_file=vocab_path,
    do_lower_case=False,
    do_basic_tokenize=False,
    tokenize_chinese_chars=False
)
d_tokenizer.encode_plus(np.array(["AXEF"])[0], 
                      max_length=20,
                      pad_to_max_length=True,
                      add_special_tokens=True,
                      truncation=True,
                      return_tensors='pt')

由此,我正在构建一个带有自定义整理功能的 pytorch 数据集。 collat​​e 函数所做的就是获取所有输入张量并将它们堆叠起来

from transformers import BatchEncoding
    def collate_fn(self, batch):
        # this function will not work for higher dimension inputs
        elem = batch[0]
        elem_type = type(elem)
        if isinstance(elem, BatchEncoding):
            new_shapes = {key: (len(batch), value.shape[1]) for key, value in elem.items()}
            outs = {key: value.new_empty(new_shapes[key]) for key, value in elem.items()}
            if torch.utils.data.get_worker_info() is not None:
                [v.share_memory_() for v in outs.values()]
            return {key: torch.stack(tuple((d[key].view(-1) for d in batch)), 0, out=outs[key]) for key in elem.keys()}
        else:
            raise ValueError(f"type: {elem_type} not understood")

问题 1: 所以我想知道 BatchEncoding 或其他类是否已经能够做到这一点(并且做得更好?)。或者完全使用不同的 Dataset/DataLoader 类。

问题 2: 此外,我想根据屏蔽 LM 的要求屏蔽一些输入,但是我没有设法在转换器库中找到任何实现。有什么建议吗?

【问题讨论】:

    标签: python-3.x pytorch huggingface-transformers huggingface-tokenizers


    【解决方案1】:

    经过一番挖掘,我发现了一个 DataCollat​​or,它实现了用掩码令牌随机替换令牌:https://github.com/huggingface/transformers/blob/615be03f9d961c0c9722fe10e7830e011066772e/src/transformers/data/data_collator.py#L69。所以我将我的 DataSource 更改为在 __getitem__ 方法中返回原始文本而不是 BatchEncoding,然后在 collat​​e 函数中进行编码和屏蔽。

    【讨论】:

      猜你喜欢
      • 2022-06-28
      • 2022-01-04
      • 2020-09-30
      • 2021-11-02
      • 2021-11-24
      • 2022-01-01
      • 2022-01-03
      • 2021-03-30
      • 2021-04-01
      相关资源
      最近更新 更多