尝试使用 BERT 模型制作文本情感分类器,但得到
ValueError : too many dimensions 'str'
这是训练数据值的DataFrame;所以它们是train_labels
0 notr
1 notr
2 notr
3 negative
4 notr
... ...
854 positive
855 notr
856 notr
857 notr
858 positive
并且有代码产生错误
train_seq = torch.tensor(tokens_train['input_ids'])
train_mask = torch.tensor(tokens_train['attention_mask'])
train_y = torch.tensor(train_labels.tolist())
At train_y = torch.tensor(train_labels.tolist());
出现错误:
ValueError: too many dimensions 'str'
你能帮我吗
原因
问题是您在 torch.tensor() 中传递字符串列表(str),它只接受数值列表(整数、浮点等)。
解决方案
所以我建议您在将字符串标签传递给 torch.tensor() 之前将其转换为整数值。
实施
以下代码可能对您有帮助
# a temporary list to store the string labels
temp_list = train_labels.tolist()
# dictionary that maps integer to its string value
label_dict = {}
# list to store integer labels
int_labels = []
for i in range(len(temp_list)):
label_dict[i] = temp_list[i]
int_labels.append(i)
现在将此 int_labels 传递给 torch.tensor 并将其用作标签。
train_y = torch.tensor(int_labels)
每当你想查看任何整数各自的字符串标签时,只需使用 label_dict 字典即可。
我也遇到了同样的问题: 这对我有用,我想你需要在阅读 csv 后在代码开头执行此操作:
df['labels'] = df['labels'].replace(['negative','notr','positive'],[0,1,2])
然后从这些标签中分离出来进行训练和测试。
假设您使用的是huggingface,
您需要使用🤗数据集
python
from datasets import ClassLabel
c2l = ClassLabel(num_classes=2, names=['spam', 'ham'])
labels = ["spam", "ham", "ham"]
[c2l.str2int(label) for label in labels ]
# [0, 1, 1]
更多参考: https://discuss.huggingface.co/t/converting-string-label-to-int/2816
谢谢,确实转换成了整数,但是分类有问题;
0
0 positive
1 negative
2 positive
3 notr
4 positive
... ...
4002 notr
4003 positive
4004 positive
4005 notr
4006 negative
Frame 有该数据,转换为 int 后,
0 0
1 1
2 2
3 3
4 4
... ...
4002 4002
4003 4003
4004 4004
4005 4005
4006 4006
就这样,我需要的是所有正数、中性数和负数,表示为 0 代表 neg-1 代表中性 - 2 代表 pos
“将标签类别替换为数值,以避免“str 中维度过多”
data['labels'] = data['labels'].replace(['inattention to results', 'fear of conflict', 'lack of commitment',
'avoidance of accountability', 'absence of trust'],[0,1,2,3,4])
您无法将字符串列表转换为 Torch 张量。
您需要先将字符串转换为整数或浮点数:
# my_list has strings it it
my_list = ['0','1','2','3','4']
# Items are strings
type(my_list[0])
# > str
# Fail to convert to Torch Tensor
# torch.tensor(my_list)
# > ValueError: too many dimensions 'str'
# Convert each item to integer
my_list = [int(item) for item in my_list]
# Now, items are integers
type(my_list[0])
# > int
# Success
torch.tensor(my_list)
# > tensor([0, 1, 2, 3, 4])
我在下面遇到了同样的错误:
ValueError:“str”维度太多
因为我尝试创建一个带有字符串值的张量,这是不可能的,如下所示:
import torch
torch.tensor(['a', 'b', 'c']) # Error
但是,我可以根据文档创建一个带有数字和布尔值的张量,如下所示:
import torch
torch.tensor([0, 1, 2]) # tensor([0, 1, 2])
torch.tensor([0., 1., 2.]) # tensor([0., 1., 2.])
torch.tensor([3.+1.j, 2.+5.j, 4.+3.j]) # tensor([3.+1.j, 2.+5.j, 4.+3.j])
torch.tensor([True, False, True]) # tensor([ True, False, True])