我在项目中使用的是变压器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]
我的vocab看起来像这样
[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数据集。 整理功能要做的就是获取所有输入张量并将它们堆叠
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掩盖某些输入,但是我没有设法在转换器库中找到任何实现。有什么建议吗?
答案 0 :(得分:0)
经过更多的挖掘后,我发现了一个DataCollator,它实现了在https://github.com/huggingface/transformers/blob/615be03f9d961c0c9722fe10e7830e011066772e/src/transformers/data/data_collator.py#L69处用mask令牌随机替换令牌。因此,我将DataSource更改为返回原始文本,而不是在__getitem__
方法中返回BatchEncoding,然后在collate函数中进行编码和屏蔽。