PyTorch DataLoader TypeError求助:RoBERTa情感分析任务报错
RoBERTa情感分析DataLoader TypeError问题分析与解决
嘿,我来帮你拆解这个问题,其实根源很明显,咱们一步步来:
问题定位
你在执行dt = next(iter(train_data_loader))时触发了如下错误:
TypeError: new(): invalid data type 'str'
这个错误直接指向你GPReviewDataset类__getitem__方法里的这行代码:
'targets': torch.tensor(target, dtype=torch.long)
核心原因是:你传入的target是字符串类型,但torch.long要求输入必须是数值型(整数),PyTorch无法直接将字符串转换为long类型的张量。
为什么会出现这个情况?
看你的create_data_loader函数,你直接从DataFrame中提取df.sentiment.to_numpy()作为targets传入Dataset:
targets=df.sentiment.to_numpy(),
这说明你的DataFrame里的sentiment列存储的是字符串形式的标签(比如"positive"/"negative"这类文本),而不是0/1或者其他整数编码的数值标签。
解决方案
你需要先把字符串类型的情感标签转换为整数,这里提供两种常用的处理方式:
方式1:提前预处理DataFrame
在创建DataLoader之前,直接对DataFrame的sentiment列做编码转换:
# 假设你的标签是"positive"(正面)和"negative"(负面) df['sentiment'] = df['sentiment'].map({'positive': 1, 'negative': 0}) # 如果是多分类,比如包含"neutral"(中性),可以扩展映射 # df['sentiment'] = df['sentiment'].map({'positive': 2, 'neutral': 1, 'negative': 0})
方式2:在Dataset类内部处理标签
如果你不想修改原始DataFrame,也可以在GPReviewDataset的__getitem__方法中完成标签转换:
def __getitem__(self, item): review = str(self.reviews[item]) target = self.targets[item] # 新增:将字符串标签转换为整数 label_mapping = {'positive': 1, 'negative': 0} target = label_mapping[target] encoding = self.tokenizer.encode_plus( review, add_special_tokens=True, max_length=self.max_len, return_token_type_ids=False, pad_to_max_length=True, return_attention_mask=True, return_tensors='pt', ) return { 'review_text': review, 'input_ids': encoding['input_ids'].flatten(), 'attention_mask': encoding['attention_mask'].flatten(), 'targets': torch.tensor(target, dtype=torch.long) }
验证小技巧
修改完成后,建议先单独测试Dataset的__getitem__方法,确认返回的targets是整数类型的张量:
# 假设你已经创建了ds实例 sample_data = ds[0] print("Target类型:", type(sample_data['targets'])) print("Target值:", sample_data['targets'])
确认输出是整数类型的张量后,再运行DataLoader的代码,就不会再触发这个错误了。
内容的提问来源于stack exchange,提问作者Markus Khoa
相关产品推荐
相关产品推荐

