batch

batch,第1张

batch

这个bug发生于写BERT的在线inference代码。错误如下:

Traceback (most recent call last):
  File "classifier.py", line 94, in 
    result = clf.predict(content)
  File "classifier.py", line 77, in predict
    outputs = self.model(ids, mask, token_type_ids)
  File "/data/angchen/env/torch/lib/python3.6/site-packages/torch/nn/modules/module.py", line 493, in __call__
    result = self.forward(*input, **kwargs)
  File "../src/bert.py", line 29, in forward
    _, output_1 = self.l1(ids, attention_mask = mask, token_type_ids=token_type_ids)
  File "/data/angchen/env/torch/lib/python3.6/site-packages/torch/nn/modules/module.py", line 493, in __call__
    result = self.forward(*input, **kwargs)
  File "/data/angchen/env/torch/lib/python3.6/site-packages/transformers/models/bert/modeling_bert.py", line 950, in forward
    batch_size, seq_length = input_shape
ValueError: not enough values to unpack (expected 2, got 1)

inference部分代码如下:

46     def tokenize(self, text):
 47         text = text.strip()
 48         inputs = self.tokenizer.encode_plus(
 49             text,
 50             None,
 51             add_special_tokens=True,
 52             max_length=self.max_len,
 53             pad_to_max_length=True, #不足部分填充
 54             return_token_type_ids=True,
 55             truncation=True #超过部分截断
 56             )
 57 
 58         #提取id, attention mask, token type id
 59         ids = torch.tensor(inputs['input_ids'], dtype=torch.long).to(device, dtype=torch.long)
 60         mask = torch.tensor(inputs['attention_mask'], dtype=torch.long).to(device, dtype=torch.long)
 61         token_type_ids = torch.tensor(inputs['token_type_ids'], dtype=torch.long).to(device, dtype=torch.long)
 62 
 63         return ids, mask, token_type_ids
 64 
 65 
 66     def predict(self, content):
 67         result = {}
 68         #如果content为空 (文本分类器可以预测不包含汉字的文本) 则直接返回结果
 69         if not content:
 70             result["category"] = -1
 71             result["catScores"] = []
 72             return result
 73         ids, mask, token_type_ids = self.tokenize(content)
 74         print("ids:n", ids, "size:n", ids.size())
 75         print("mask:n", mask)
 76         print("token_type_ids:n", token_type_ids)
 77         outputs = self.model(ids, mask, token_type_ids)
 78         print(outputs)
 79         """

后来发现原因是预测部分喂给模型的是一个长度为 [200]的tensor,而模型要求tensor至少还有一个维度,比如[1, 200],所以导致了 batch_size, seq_length = input_shape
ValueError: not enough values to unpack (expected 2, got 1)

解决方案:
因为缺少一个维度,所以要增加一个维度,这里用unsqueeze函数。修改tokenize函数代码如下:

46     def tokenize(self, text):
 47         text = text.strip()
 48         inputs = self.tokenizer.encode_plus(
 49             text,
 50             None,
 51             add_special_tokens=True,
 52             max_length=self.max_len,
 53             pad_to_max_length=True, #不足部分填充
 54             return_token_type_ids=True,
 55             truncation=True #超过部分截断
 56             )
 57 
 58         #提取id, attention mask, token type id
 59         ids = torch.tensor(inputs['input_ids'], dtype=torch.long).to(device, dtype=torch.long).unsqueeze(0)
 60         mask = torch.tensor(inputs['attention_mask'], dtype=torch.long).to(device, dtype=torch.long).unsqueeze(0)
 61         token_type_ids = torch.tensor(inputs['token_type_ids'], dtype=torch.long).to(device, dtype=torch.long).unsqueeze(0)
 62 
 63         return ids, mask, token_type_ids

之后就能跑通了

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5580102.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-14
下一篇 2022-12-14

发表评论

登录后才能评论

评论列表(0条)

保存