使用 BERT 文本分类,出现 ValueError: Too muchdimension 'str' 错误

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

尝试使用 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'

你能帮我吗

enter image description here

enter image description here

python tensor text-classification bert-language-model mlp
7个回答
13
投票

原因

问题是您在 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 字典即可。


11
投票

我也遇到了同样的问题: 这对我有用,我想你需要在阅读 csv 后在代码开头执行此操作:

df['labels'] = df['labels'].replace(['negative','notr','positive'],[0,1,2]) 

然后从这些标签中分离出来进行训练和测试。


3
投票

假设您使用的是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
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


0
投票

“将标签类别替换为数值,以避免“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])

0
投票

您无法将字符串列表转换为 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])

0
投票

我在下面遇到了同样的错误:

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])
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.