我正在 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 个条目)
我已经搜索了很多上述错误。最后,我发现上述错误的主要原因是“没有正确清理数据集”。原因(就我而言)是标签列中的值显示为浮点数,而不是整数。通过使用 pandas,我将所有 float 值更改为 int,之后代码成功运行。 因此,花更多的时间来清理数据而不是编写代码。 谢谢。
您是否有想要预测的分类目标(即分类)?假设有一个名为 y 的二进制目标,其中包含 0 和 1?可能您的目标变量不是以长格式编码为
int64
,而是以int32
编码。只需在创建 DataLoader
之前将该目标变量转换为 64 位,就可以了。
有2种可能的方法:
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)
同样的错误也发生在我身上。 我可以确认将标签的浮点值更改为 int64 对我有用。 非常感谢。
data['label'] = data['label'].astype('int64')