运行时错误:期望标量类型为 Long 的对象,但在调用 _thnn_nll_loss_forward 时得到参数 #2“目标”的标量类型 Float

问题描述 投票:0回答:3

我正在 Tweeter 数据集上尝试 Bert。我遇到以下错误消息。

# set initial loss to infinite
best_valid_loss = float('inf')

# empty lists to store training and validation loss of each epoch
train_losses=[]
valid_losses=[]

#for each epoch
for epoch in range(epochs):
 
    print('\n Epoch {:} / {:}'.format(epoch + 1, epochs))

#train model
train_loss, _ = train()

#evaluate model
valid_loss, _ = evaluate()

#save the best model
if valid_loss < best_valid_loss:
    best_valid_loss = valid_loss
    torch.save(model.state_dict(), 'saved_weights.pt')

# append training and validation loss
train_losses.append(train_loss)
valid_losses.append(valid_loss)

print(f'\nTraining Loss: {train_loss:.3f}')
print(f'Validation Loss: {valid_loss:.3f}')

这是一个很长的代码。搜索问题导致我将 .float() 更改为 long()。我已经这么做了。请建议我解决方案。 非常重要:相同的代码在另一个数据集(具有相同的列数和相同的数据类型)上运行得很好,但不适用于推文数据。 (唯一的区别是大小。之前的数据集有 5500 个条目,而推文数据集有 10000 个条目)

python pytorch
3个回答
1
投票

我已经搜索了很多上述错误。最后,我发现上述错误的主要原因是“没有正确清理数据集”。原因(就我而言)是标签列中的值显示为浮点数,而不是整数。通过使用 pandas,我将所有 float 值更改为 int,之后代码成功运行。 因此,花更多的时间来清理数据而不是编写代码。 谢谢。


0
投票

您是否有想要预测的分类目标(即分类)?假设有一个名为 y 的二进制目标,其中包含 0 和 1?可能您的目标变量不是以长格式编码为

int64
,而是以
int32
编码。只需在创建
DataLoader
之前将该目标变量转换为 64 位,就可以了。

有2种可能的方法:

  • 要么保留为 numpy 数组并在那里进行转换,
  • 或者转换为torch数组,然后转换为Long格式。
import torch
import numpy as np
y

# array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1,
#       1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
#       1])

y.dtype

# dtype('int32')
# numpy
y = y.astype('int64')

y
# array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1,
#       1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
#       1], dtype=int64)

# torch
y = torch.from_numpy(y).to(dtype=torch.long)

0
投票

同样的错误也发生在我身上。 我可以确认将标签的浮点值更改为 int64 对我有用。 非常感谢。

data['label'] = data['label'].astype('int64')
© www.soinside.com 2019 - 2024. All rights reserved.