TypeError: nll_loss_nd(): argument 'input' (position 1) must be Tensor, not tuple

TypeError: nll_loss_nd(): argument 'input' (position 1) must be Tensor, not tuple

所以我正在尝试训练我的 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\#####\venv\lib\site-packages\torch\nn\modules\module.py", line 1102, in _call_impl
    return forward_call(*input, **kwargs)
  File "C:\Users\######\venv\lib\site-packages\torch\nn\modules\loss.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\######\venv\lib\site-packages\torch\nn\functional.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() 函数 return 是元组。现在 - 我的问题是我应该如何处理这样的问题?如何将 train() 函数的输出更改为 return 张量而不是元组? 我在这里看到过类似的问题,但 none 的解决方案似乎对我有帮助,甚至

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

非常感谢在此案例中提供的任何帮助,并提前致谢!

就是这样returns

  • loss (torch.FloatTensor of shape (1,), 可选,标签时返回 提供)——分类(或回归,如果 config.num_labels==1) 损失。
  • logits (torch.FloatTensor 的形状 (batch_size, config.num_labels)) — 分类(或回归,如果 config.num_labels==1)得分(之前 SoftMax).
  • hidden_states (元组(torch.FloatTensor),可选,返回时 output_hidden_states=True 通过或当 config.output_hidden_states=True) — torch.FloatTensor 的元组(一个 用于嵌入的输出 + 一个用于每一层的输出) 形状(batch_size、sequence_length、hidden_size)。 每层输出的模型隐藏状态加上 初始嵌入输出。
  • attentions(tuple(torch.FloatTensor),可选,返回时 output_attentions=True 或当 config.output_attentions=True) — torch.FloatTensor 的元组(一个用于 每层)的形状(batch_size、num_heads、sequence_length、 sequence_length).

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