You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用SciBERT做K折交叉验证遇TypeError:字符串标签无法转张量

问题解决方案

1. 先确认标签列的类型与内容

先排查标签列的实际格式,确认是否为字符串类型:

print(df['label'].dtype)
print(df['label'].unique())

如果输出是object(对应字符串),且标签是['positive', 'negative', 'neutral']这类文本值,必须先转为数值型才能生成张量。

2. 将字符串标签映射为数值

方法一:手动映射(适合标签类别少的场景)

直接定义映射字典转换:

label_map = {'positive': 0, 'negative': 1, 'neutral': 2}
df['label'] = df['label'].map(label_map)

方法二:用LabelEncoder自动编码(适合类别多或不确定的场景)

借助sklearn工具统一编码:

from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
df['label'] = le.fit_transform(df['label'])

如果是多标签分类(比如标签是逗号分隔的字符串),改用MultiLabelBinarizer拆分编码:

from sklearn.preprocessing import MultiLabelBinarizer
mlb = MultiLabelBinarizer()
df['label'] = df['label'].str.split(',').tolist()
df['label'] = list(mlb.fit_transform(df['label']))

3. 修正自定义Dataset的标签处理逻辑

在__getitem__方法中,直接将数值型标签转为指定类型的PyTorch张量:

class TextDataset(Dataset):
    def __init__(self, df, tokenizer, max_len):
        self.texts = df['text'].values
        self.labels = df['label'].values  # 此时已为数值型
        self.tokenizer = tokenizer
        self.max_len = max_len

    def __len__(self):
        return len(self.texts)

    def __getitem__(self, idx):
        text = str(self.texts[idx])
        label = self.labels[idx]

        encoding = self.tokenizer.encode_plus(
            text,
            add_special_tokens=True,
            max_length=self.max_len,
            return_token_type_ids=False,
            padding='max_length',
            truncation=True,
            return_attention_mask=True,
            return_tensors='pt',
        )

        return {
            'input_ids': encoding['input_ids'].flatten(),
            'attention_mask': encoding['attention_mask'].flatten(),
            'label': torch.tensor(label, dtype=torch.long)  # 分类任务用long型,回归用float
        }

关键:必须指定dtype——分类任务标签是整数,用torch.long;回归任务用torch.float。之前的错误核心就是标签还是字符串,PyTorch不支持直接生成字符串类型的张量。

4. 验证数据正确性

实例化Dataset后,抽取样本检查标签类型:

dataset = TextDataset(df, tokenizer, max_len=128)
sample = dataset[0]
print(type(sample['label']))
print(sample['label'].dtype)

正常应输出<class 'torch.Tensor'>和torch.int64(对应torch.long)。

5. K折交叉验证的编码一致性

做K折时,必须保证所有折的标签编码规则统一——先在整个数据集上完成编码,再拆分训练/验证集:

from sklearn.model_selection import KFold

# 先对全量数据做标签编码
le = LabelEncoder()
df['label'] = le.fit_transform(df['label'])

kf = KFold(n_splits=5, shuffle=True, random_state=42)
for fold, (train_idx, val_idx) in enumerate(kf.split(df)):
    train_df = df.iloc[train_idx]
    val_df = df.iloc[val_idx]
    # 后续创建DataLoader、训练模型逻辑

内容的提问来源于stack exchange,提问作者Hoang Cuong Nguyen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 13:25:02