LayoutLMv2预处理数据报Class label -100 less than -1错误如何解决
LayoutLMv2Processor预处理报「ValueError: Class label -100 less than -1」解决方案
报错根因
触发这个错误的核心原因是传入LayoutLMv2Processor的序列标注类标签不符合内置校验规则:
处理器做标签合法性校验时,仅允许标签值≥-1(其中-1是处理器约定的、特殊token/子词后缀位置的忽略标签占位符),但很多开发者会按照PyTorch序列标注任务的通用写法,提前把需要忽略计算损失的位置标签设为-100,这个值低于处理器允许的最小标签值-1,就会直接抛出校验错误。
可直接落地的修复方法
不要在传入处理器的标签里提前使用-100作为忽略位标记,按以下流程处理标签即可:
- 调用processor处理数据时,只传入原始词级别的业务标签,不要提前做特殊token位的标签填充,也不要手动传入带
-100值的标签序列,让处理器自动完成词标签到分词后token序列的对齐工作,这一步处理器会自动给所有需要忽略的位置填上占位值-1 - 拿到processor返回的编码结果后,再统一把标签序列里所有值为
-1的位置替换为PyTorch损失函数默认识别的忽略索引-100,后续训练时损失计算会自动跳过这些位置,不会影响训练效果
核心修复代码参考:
def preprocess_func(sample): # 传入原始数据,不要提前处理标签 processed = processor( images=sample["image"], text=sample["words"], boxes=sample["bbox"], word_labels=sample["ner_tag"], padding="max_length", truncation=True ) # 处理器对齐标签后,替换忽略位为PyTorch兼容的-100 processed["labels"] = [ -100 if tag == -1 else tag for tag in processed["labels"] ] return processed
注意不要通过修改Processor源码里的标签校验阈值绕过报错,这种方式会在后续升级依赖版本时失效,还可能引发标签越界的隐蔽问题。
内容的提问来源于stack exchange,提问作者Fedi Hachicha
相关产品推荐
相关产品推荐

