使用RoBERTa做IMDB情感分析时遭遇Cast_1类型转换错误求助
解决IMDB情感分析中Roberta模型的Cast_1错误
错误现象
运行代码时出现以下错误:
Node: 'Cast_1' Cast string to float is not supported [[{{node Cast_1}}]] [Op:__inference_train_function_24202]
问题根源
- Tokenizer不匹配:你使用了Keras原生的
Tokenizer处理文本,但加载roberta-base模型需要用Hugging Face提供的专用Tokenizer。预训练Roberta模型有自己的词汇表和编码规则,Keras Tokenizer生成的序列无法被正确解析,导致输入类型不兼容。 - 模型类错误:加载roberta-base必须使用
TFRobertaForSequenceClassification,而非TFBertForSequenceClassification,两者属于不同预训练体系,混用会引发输入处理异常。 - 标签格式问题:若
Sentiment列是字符串类型(如"positive"/"negative"),sparse_categorical_crossentropy要求标签为整数,需先完成映射转换。
修正后的完整代码
# 导入必要库 import pandas as pd import numpy as np from sklearn.model_selection import train_test_split from transformers import TFRobertaForSequenceClassification, RobertaTokenizer # 加载数据 data = pd.read_excel('/content/drive/MyDrive/499A_Project/Dataset/IMDB5000.xlsx') # 划分训练测试集 train_data, test_data = train_test_split(data, test_size=0.3, random_state=42) # 使用Roberta专用Tokenizer tokenizer = RobertaTokenizer.from_pretrained('roberta-base') # 编码文本,生成模型所需的input_ids和attention_mask def encode_texts(texts, tokenizer, max_length=128): return tokenizer( texts.tolist(), padding='max_length', truncation=True, max_length=max_length, return_tensors='tf' ) train_encodings = encode_texts(train_data['Review'], tokenizer) test_encodings = encode_texts(test_data['Review'], tokenizer) # 处理标签:将字符串标签转为整数(根据实际标签值调整映射关系) label_mapping = {'negative': 0, 'positive': 1} train_labels = train_data['Sentiment'].map(label_mapping).values test_labels = test_data['Sentiment'].map(label_mapping).values # 加载Roberta分类模型 model = TFRobertaForSequenceClassification.from_pretrained( 'roberta-base', num_labels=2 # 二分类任务设置为2 ) # 编译模型 model.compile( loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy'] ) # 训练模型 model.fit( {'input_ids': train_encodings['input_ids'], 'attention_mask': train_encodings['attention_mask']}, train_labels, batch_size=32, epochs=10, validation_data=( {'input_ids': test_encodings['input_ids'], 'attention_mask': test_encodings['attention_mask']}, test_labels ) )
关键说明
- 专用Tokenizer:Hugging Face的Tokenizer会生成Transformer模型标准输入格式(
input_ids和attention_mask),这是预训练模型必需的输入,不能用Keras Tokenizer替代。 - 模型类匹配:不同预训练模型对应专属的TF类,roberta-base必须搭配
TFRobertaForSequenceClassification使用。 - 标签兼容性:确保标签为整数类型,如果是多分类场景,可改用
to_categorical生成独热编码,对应使用categorical_crossentropy损失函数。
内容的提问来源于stack exchange,提问作者Akif Hasan
相关产品推荐
相关产品推荐

