微调RoBERTa文本情感分类器单样本预测解包错误问题求助
问题修复方案
错误根因
报错出现在RoBERTa模型前向传播阶段:你传入的input_ids(代码中对应sequence_padded)是形状为[序列长度]的一维张量,而HuggingFace Transformers库的预训练模型默认要求输入张量的第一维为批量大小,输入形状应为[批量大小, 序列长度],缺少批量维度导致模型无法正常解包输入形状。
修复步骤
你需要修改预测函数的三处核心逻辑:
- 给输入张量增加批量维度
对编码得到的id和attention_mask张量调用unsqueeze(0),在第0维新增批量维度:
encoded = tokenizer.encode(text) # 新增unsqueeze(0)增加batch维度 sequence_padded = torch.tensor(encoded.ids).unsqueeze(0) attention_mask_padded = torch.tensor(encoded.attention_mask).unsqueeze(0) # 如果模型加载在GPU上,需要补充设备移动逻辑,示例: # sequence_padded = torch.tensor(encoded.ids).unsqueeze(0).to('cuda') # attention_mask_padded = torch.tensor(encoded.attention_mask).unsqueeze(0).to('cuda')
- 修正输出处理逻辑
你自定义的分类模型输出是对应类别的logits值,不是token id,不需要调用tokenizer解码,直接取概率最高的类别索引即可,同时预测阶段需要关闭梯度计算、切换模型为评估模式:
model.eval() with torch.no_grad(): output = model((sequence_padded, attention_mask_padded)) # 取概率最高的类别索引 pred_label_id = torch.argmax(output, dim=-1).item() # 可根据自己的标签映射把id转成实际语义标签,示例: # label_map = {0:"负面", 1:"正面"} # label = label_map[pred_label_id] return pred_label_id
- 可选性能优化
不要在get_label函数内部重复实例化tokenizer,把tokenizer的初始化逻辑移到函数外部,避免每次预测都重复加载词表浪费性能。
内容的提问来源于stack exchange,提问作者user14501128
相关产品推荐
相关产品推荐

