transformers加载本地模型报错AttributeError: 'list' object has no attribute 'items'

问题描述
加载本地模型一直报错,使用的也是transformers3.4.0稳定版本,求解答

报错代码

from transformers import AutoTokenizer, AutoModel
#tokenizer = AutoTokenizer.from_pretrained("srt/nong-sikubert/checkpoint-3752")
model = AutoModel.from_pretrained("nong-sikubert/checkpoint-3752")

报错

PS C:\Users\Apple\PycharmProjects\srt> & C:/Users/Apple/anaconda3/envs/pytorch/python.exe c:/Users/Apple/PycharmProjects/srt/demo.py    
Traceback (most recent call last):
  File "c:/Users/Apple/PycharmProjects/srt/demo.py", line 9, in <module>
    model = AutoModel.from_pretrained("nong-sikubert/checkpoint-3752")
  File "C:\Users\Apple\anaconda3\envs\pytorch\lib\site-packages\transformers\modeling_auto.py", line 623, in from_pretrained
    config, kwargs = AutoConfig.from_pretrained(
  File "C:\Users\Apple\anaconda3\envs\pytorch\lib\site-packages\transformers\configuration_auto.py", line 334, in from_pretrained       
    return config_class.from_dict(config_dict, **kwargs)
  File "C:\Users\Apple\anaconda3\envs\pytorch\lib\site-packages\transformers\configuration_utils.py", line 417, in from_dict
    config = cls(**config_dict)
  File "C:\Users\Apple\anaconda3\envs\pytorch\lib\site-packages\transformers\configuration_bert.py", line 129, in __init__
    super().__init__(pad_token_id=pad_token_id, **kwargs)
  File "C:\Users\Apple\anaconda3\envs\pytorch\lib\site-packages\transformers\configuration_utils.py", line 191, in __init__
    self.id2label = dict((int(key), value) for key, value in self.id2label.items())
AttributeError: 'list' object has no attribute 'items'

基于new bing部分指引作答:
根据报错信息,问题出现在加载模型配置文件时。报错信息显示 AttributeError: 'list' object has no attribute 'items',这意味着配置文件中的id2label属性应该是一个字典对象,但实际上它被解析为了一个列表对象。

这可能是由于模型配置文件的格式不正确导致的。您可以尝试解决这个问题的方法是手动更改模型配置文件,将id2label属性从列表转换为字典。

找到模型配置文件,它通常以.json或.config结尾,并用文本编辑器打开它。在文件中找到id2label属性,如果它是一个列表形式的项,类似于"id2label": [0, 1, 2],请将其修改为字典形式,例如"id2label": {"0": "label0", "1": "label1", "2": "label2"}。确保字典的键和值适合您的具体任务,键是标签的ID,值是标签的名称。

保存更改后的配置文件,并尝试再次加载模型,看看问题是否解决了。

configuration_utils.py 文件中的 191 行,错误原因是 self.id2label 被赋值为了一个列表对象(list),而不是字典对象(dict)。
可能是你提供的预训练模型的配置文件出现了问题,建议检查 nong-sikubert/checkpoint-3752 对应的配置文件是否正确或者是否存在异常情况,如数据格式错误啥的
如有帮助给个采纳谢谢

这个错误通常是由于代码中使用了错误的变量引用导致的。具体来说,当你试图将一个Python列表作为参数传递给transformers的load_local_model函数时,就会出现这个错误。

要解决这个问题,你需要检查你的代码并确保你正在正确地引用变量。例如,如果你的代码如下所示:

from transformers import load_local_model

model_path = ["./model"]
model = load_local_model(model_path)

那么错误就会发生,因为load_local_model函数需要传递一个字典作为参数,而不是一个列表。要解决这个问题,你需要将代码中的变量修改为字典,如下所示:

from transformers import load_local_model

model_path = {"model": "./model"}
model = load_local_model(model_path)

这样就可以正确加载本地模型了。如果你仍然遇到其他问题,请务必查看transformers文档以获取更多帮助。

可能是由于配置文件的格式错误或加载错误的配置文件造成的。
尝试重新下载模型或使用其他模型,也可以检查配置文件是否存在,并尝试手动加载它以确保它的正确性。

这个错误可能是因为您在加载模型时,传递的参数有误。通常情况下,您需要同时加载tokenizer和model,然后使用它们来处理输入数据。您可以尝试以下代码:

from transformers import AutoTokenizer, AutoModel

tokenizer = AutoTokenizer.from_pretrained("srt/nong-sikubert/checkpoint-3752")
model = AutoModel.from_pretrained("srt/nong-sikubert/checkpoint-3752")

请确保您已经安装了transformers库,并且模型已经被正确下载到本地。如果您已经下载了模型,但是仍然遇到错误,请检查您传递给模型的参数是否正确,并且与您下载的模型相匹配。如果问题仍然存在,请尝试重新下载模型并重新运行代码。

id2label是个list,不是dict

最好还是确认配置文件格式是否正确,或者选择一个格式正确的第三方 BERT 模型

回答部分参考、引用ChatGpt以便为您提供更准确的答案:

根据您提供的报错信息,问题可能出现在配置文件上。报错指出在配置BERT模型时出现了问题,具体是在尝试将id2label属性转换为字典时出错,因为id2label属性是一个列表对象,不支持items()方法。

解决这个问题的一种方法是检查您所使用的模型的配置文件是否正确。您可以尝试使用以下代码加载配置文件并创建模型:

from transformers import AutoConfig, AutoModel

config = AutoConfig.from_pretrained("nong-sikubert/checkpoint-3752")
model = AutoModel.from_config(config)

这样,您将直接从预训练模型的配置文件创建模型,而不是尝试从模型的权重文件中自动加载配置。

如果问题仍然存在,可能是由于模型的权重文件与配置文件不匹配导致的。请确保使用的权重文件与您所使用的配置文件相对应。

另外,您提到使用的是Transformers 3.4.0版本,建议您考虑升级到较新的版本,因为新版本通常包含了修复和改进。

请尝试以上方法,并确认您使用的是正确的配置文件和权重文件。如果问题仍然存在,请提供更多关于模型和配置的信息,以便我能够更好地帮助您。