使用Hugging Face evaluate加载accuracy指标时触发TypeError求助
问题:加载Hugging Face evaluate库accuracy指标时触发TypeError: 'NoneType' object is not callable
我在基于Bert及其他编码器模型做文本分类任务,调用evaluate.load("accuracy")加载准确率指标时,出现以下错误:
─────────────────────────────── Traceback (most recent call last) ────────────────────────────────╮ │ /home/ubuntu/Bill_PyCharm/absa-three/yasi_encoder/yasi_roberta.py:94 in <module> │ │ │ │ 91 test_dataset = datasets.Dataset.from_dict(train_ds.get_dataset()) │ │ 92 │ │ 93 """## Train Loop""" │ │ ❱ 94 accuracy = evaluate.load("accuracy") │ │ 95 # accuracy = evaluate.load("../evaluate/accuracy.py") │ │ 96 # recall = evaluate.load("recall") │ │ 97 # precision = evaluate.load("precision") │ │ │ │ /home/ubuntu/anaconda3/lib/python3.9/site-packages/evaluate/loading.py:778 in load │ │ │ │ 775 │ │ path, module_type=module_type, revision=revision, download_config=download_confi │ │ 776 │ ).module_path │ │ 777 │ evaluation_cls = import_main_class(evaluation_module) │ │ ❱ 778 │ evaluation_instance = evaluation_cls( │ │ 779 │ │ config_name=config_name, │ │ 780 │ │ process_id=process_id, │ │ 781 │ │ num_process=num_process, │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────╯ TypeError: 'NoneType' object is not callable
相关源代码
"""# Loading the Libraries & Models""" import pandas as pd import numpy as np import evaluate import torch from datasets import Dataset import datasets from torch.utils.data import Dataset from transformers import (AutoTokenizer, AutoModelForSequenceClassification, TrainingArguments, Trainer) device = 'cuda' if torch.cuda.is_available() else 'cpu' print(f"Device: {device}") check_point = "xlm-roberta-base" # check_point = "hfl/chinese-roberta-wwm-ext" output_dir = "./models/yasi/" + check_point tokenizer = AutoTokenizer.from_pretrained(check_point) model = AutoModelForSequenceClassification.from_pretrained(check_point, num_labels=2).to(device) import pandas as pd from datasets import Dataset from sklearn.model_selection import train_test_split import json # 读取配置文件 config_file = '../HyperParameter/config.json' with open(config_file, 'r') as f: config = json.load(f) # 从配置中获取需要的值 batch_size = config['batch_size'] dataset = config['dataset'] epoch = config['epoch'] # 读取数据集 data = pd.read_csv(dataset, sep='\t') # 随机划分数据集 train_data, remaining_data = train_test_split(data, test_size=0.2, random_state=42) dev_data, test_data = train_test_split(remaining_data, test_size=0.5, random_state=42) # 将划分后的数据集转换为Dataset对象 train_df = Dataset.from_pandas(train_data) dev_df = Dataset.from_pandas(dev_data) test_df = Dataset.from_pandas(test_data) class YasiDataset(Dataset): def __init__(self, df, tokenizer: AutoTokenizer): super(YasiDataset).__init__() self.sentence = [] self.labels = [] # 读取每一行内容 for row in df: content = row["sentence"] labels = row["label"] self.sentence.append(content) self.labels.append(labels) self.labels = torch.tensor(self.labels) self.tokenizer_output = tokenizer(self.sentence, padding=True, truncation=True, max_length=512, return_tensors='pt', return_token_type_ids=True, return_attention_mask=True, ) self.tokenizer_output['labels'] = self.labels def __len__(self): return len(self.tokenizer_output['input_ids']) def get_dataset(self): return self.tokenizer_output train_ds = YasiDataset(train_df, tokenizer) dev_ds = YasiDataset(dev_df, tokenizer) test_ds = YasiDataset(test_df, tokenizer) train_dataset = datasets.Dataset.from_dict(train_ds.get_dataset()) dev_dataset = datasets.Dataset.from_dict(dev_ds.get_dataset()) test_dataset = datasets.Dataset.from_dict(test_ds.get_dataset()) """## Train Loop""" accuracy = evaluate.load("accuracy")
解决思路
- 升级evaluate库到最新版本:该错误多由版本兼容性问题导致,执行命令:
pip install --upgrade evaluate - 修复命名冲突:代码中同时导入了
datasets.Dataset和torch.utils.data.Dataset,存在命名空间冲突,会干扰第三方库的内部逻辑。修改导入方式:
后续所有使用Hugging Face Dataset的地方替换为from datasets import Dataset as HFDataset from torch.utils.data import DatasetHFDataset,避免混淆。 - 直接指定指标完整标识符:尝试通过完整路径加载指标:
accuracy = evaluate.load("evaluate-metric/accuracy") - 清理evaluate缓存:缓存损坏可能导致模块加载失败,执行以下代码后重新加载:
import evaluate evaluate.clear_cache() accuracy = evaluate.load("accuracy") - 同步依赖库版本:确保transformers、datasets与evaluate版本兼容,执行命令统一升级:
pip install --upgrade transformers datasets evaluate
内容的提问来源于stack exchange,提问作者bill yao
相关产品推荐
相关产品推荐

