类型错误: nll_loss_nd():参数"input"(位置 1)必须是张量,而不是元组



所以我正在尝试训练我的BigBird模型(BigBirdForSequenceClassification),我到了训练的那一刻,它以以下错误消息结束:

Traceback (most recent call last):
File "C:Users######", line 189, in <module>
train_loss, _ = train()  
File "C:Users######", line 152, in train
loss = cross_entropy(preds, labels)
File "C:Users#####venvlibsite-packagestorchnnmodulesmodule.py", line 1102, in _call_impl
return forward_call(*input, **kwargs)
File "C:Users######venvlibsite-packagestorchnnmodulesloss.py", line 211, in forward
return F.nll_loss(input, target, weight=self.weight, ignore_index=self.ignore_index, reduction=self.reduction)
File "C:Users######venvlibsite-packagestorchnnfunctional.py", line 2532, in nll_loss
return torch._C._nn.nll_loss_nd(input, target, weight, _Reduction.get_enum(reduction), ignore_index)
TypeError: nll_loss_nd(): argument 'input' (position 1) must be Tensor, not tuple

据我了解,出现问题是因为 train() 函数返回元组。现在 - 我的问题是我应该如何处理这个问题?如何将 train() 函数的输出更改为返回张量而不是元组? 我在这里看到了类似的问题,但似乎没有一个解决方案对我的情况有帮助,甚至没有

model = BigBirdForSequenceClassification(config).from_pretrained(checkpoint, return_dict=False)

(当我不添加 return_dict=False 时,我收到类似的错误消息,但它说"TypeError: nll_loss_nd(): argument 'input' (position 1) must be Tensor, not SequenceClassifierOutput" 请参阅下面的火车代码:

def train():
model.train()
total_loss = 0
total_preds = []

for step, batch in enumerate(train_dataloader):

if step % 10 == 0 and not step == 0:
print('Batch {:>5,}  of  {:>5,}.'.format(step, len(train_dataloader)))

batch = [r.to(device) for r in batch]
sent_id, mask, labels = batch
preds = model(sent_id, mask)
loss = cross_entropy(preds, labels)
total_loss = total_loss + loss.item()
loss.backward()
torch.nn.utils.clip_grad_norm_(model.parameters(), 1.0)
optimizer.step()
optimizer.zero_grad()
preds = preds.detach().cpu().numpy()
total_preds.append(preds)
avg_loss = total_loss / len(train_dataloader)
total_preds = np.concatenate(total_preds, axis=0)
return avg_loss, total_preds

然后:

for epoch in range(epochs):
print('n Epoch {:} / {:}'.format(epoch + 1, epochs))
train_loss, _ = train()  
train_losses.append(train_loss)
torch.backends.cudnn.deterministic = True
torch.backends.cudnn.benchmark = False

我将非常感谢对此案的任何帮助,并提前感谢您!

这是它返回的内容

  • 损失(火炬。形状 (1,) 的浮点张量,可选,标签时返回 提供) — 分类(如果 config.num_labels==1,则回归) 损失。
  • 罗吉茨(火炬。FloatTensor of shape (batch_size, config.num_labels)) — 分类(如果config.num_labels==1则回归)分数(之前 软马克斯)。
  • hidden_states(元组(火炬.FloatTensor),可选,在以下情况下返回 output_hidden_states=True 被传递或当 config.output_hidden_states=真) — 火炬元组。浮点张量(一个 对于嵌入的输出+每层的输出一个) 形状(batch_size、sequence_length、hidden_size)。 模型在每层输出处的隐藏状态加上 初始嵌入输出。
  • 注意(元组(火炬.FloatTensor),可选,在以下情况下返回 output_attentions=True 被传递或当 config.output_attentions=真) — 火炬元组。FloatTensor(一个用于 每层)的形状(batch_size、num_heads、sequence_length, sequence_length)。

好的,所以看起来我应该使用BigBirdModel而不是BigBirdForSequenceClassification - 问题已解决

相关内容

最新更新