自定义ViT模型推至Hugging Face Hub时遇JSON序列化错误求助
解决自定义ViT模型推送特征提取器时的JSON序列化错误
问题根源在于你错误地使用ViTConfig实例初始化ViTFeatureExtractor。ViTFeatureExtractor负责图像预处理(如尺寸调整、归一化),需要的是图像预处理参数,而非模型的配置对象,直接传入ViTConfig会导致序列化失败。
修复步骤
正确初始化特征提取器
你需要基于模型的输入要求,传入预处理相关参数,比如图像尺寸、归一化的均值和标准差。有两种常用方式:- 方式一:从预训练ViT的特征提取器加载配置,再按需修改
feature_extractor1 = ViTFeatureExtractor.from_pretrained('google/vit-base-patch16-224-in21k') # 如果你的模型输入尺寸不同,修改size参数 # feature_extractor1.size = (256, 256) - 方式二:手动指定所有预处理参数
feature_extractor1 = ViTFeatureExtractor( size=(224, 224), # 需与你的ViT模型输入尺寸匹配 image_mean=[0.485, 0.456, 0.406], # 常用的ImageNet归一化均值 image_std=[0.229, 0.224, 0.225] # 常用的ImageNet归一化标准差 )
- 方式一:从预训练ViT的特征提取器加载配置,再按需修改
修改后的完整代码片段
from transformers import ViTConfig, ViTFeatureExtractor, ViTForImageClassification, TrainingArguments, Trainer config = ViTConfig ( _name_or_path= "myViT", architectures= ["ViTForImageClassification"], id2label= {"0": "Benign", "1": "Malignant"}, # 确保这里设置的image_size和特征提取器的size一致 image_size=224, ... ) model1 = ViTForImageClassification(config) # 正确初始化特征提取器 feature_extractor1 = ViTFeatureExtractor(size=(224, 224), image_mean=[0.485, 0.456, 0.406], image_std=[0.229, 0.224, 0.225]) training_args1 = TrainingArguments( ... ) trainer1 = Trainer( ... ) trainer1.train() model1.push_to_hub("my-username/my-custom-vit-model") feature_extractor1.push_to_hub("my-username/my-custom-vit-model")关键注意点
- 特征提取器的
size参数必须和ViTConfig中的image_size保持一致,否则模型会因为输入尺寸不匹配报错。 - 如果你没有特殊需求,建议直接复用预训练ViT的特征提取器配置,这样能保证预处理逻辑和主流ViT模型一致,避免后续微调时出现兼容性问题。
- 特征提取器的
内容的提问来源于stack exchange,提问作者Reza
相关产品推荐
相关产品推荐

