映射图像分类对话数据集时系统消息出现'image':None的原因及解决方法
问题原因
当使用Hugging Face Dataset.map()处理包含多模态内容的对话数据时,数据集会自动对齐所有样本的字段结构。由于用户消息的内容项包含image字段,系统和助手消息的文本内容项会被自动补全image: None,以保证整个数据集的结构一致性。
解决方案
方案1:清理消息中的None字段
在映射后添加清理函数,移除内容项中值为None的字段:
def create_conversation(sample): conversation = [ { "role": "system", "content": [{"type": "text", "text": SYSTEM_PROMPT}] }, { "role": "user", "content": [ {"type": "text", "text": "Classify the following image:"}, {"type": "image", "image": sample['image']} ], } ] if sample.get('label'): conversation.append({ "role": "assistant", "content": [ {"type": "text", "text": "class0" if sample['label'] == 0 else "class1"} ] }) return {'messages': conversation} def clean_none_fields(example): cleaned_messages = [] for msg in example["messages"]: cleaned_content = [] for item in msg["content"]: # 过滤掉值为None的键值对 cleaned_item = {k: v for k, v in item.items() if v is not None} cleaned_content.append(cleaned_item) cleaned_messages.append({"role": msg["role"], "content": cleaned_content}) example["messages"] = cleaned_messages return example # 先映射创建对话,再清理None字段 train_dataset = train_dataset.map(create_conversation).map(clean_none_fields)
方案2:显式定义数据集特征
通过提前定义数据集的特征结构,明确内容项的可选字段,避免自动补全不必要的None字段:
from datasets import Features, Sequence, Value, ClassLabel # 定义单条内容的特征:text和image为可选字段 content_feature = Sequence({ "type": Value("string"), "text": Value("string", default=None), "image": Value("binary", default=None) }) # 定义单条消息的特征 message_feature = { "role": Value("string"), "content": content_feature } # 定义整个数据集的特征(保留原label字段) dataset_features = Features({ "messages": Sequence(message_feature), "label": ClassLabel(num_classes=2, names=["class0", "class1"]) }) # 创建对话后,强制转换为定义好的特征 train_dataset = train_dataset.map(create_conversation).cast(dataset_features)
以上两种方法都能让系统和助手消息仅保留纯文本内容,不再出现image: None字段。
内容的提问来源于stack exchange,提问作者GauravGiri
相关产品推荐
相关产品推荐

