You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

保存GPT2 Tokenizer时遇TypeError:property类型无法JSON序列化的解决方法

解决GPT2 Tokenizer保存时的JSON序列化错误

问题重现

用户尝试保存GPT2 Tokenizer的代码如下:

from transformers import GPT2Tokenizer, GPT2LMHeadModel
import pandas as pd

tokenizer = GPT2Tokenizer.from_pretrained("gpt2")
tokenizer.pad_token = GPT2Tokenizer.eos_token
dataset_file = "x.csv"
df = pd.read_csv(dataset_file, sep=",")
input_ids = tokenizer.batch_encode_plus(list(df["x"]), max_length=1024,padding='max_length',truncation=True)["input_ids"]

# saving the tokenizer
tokenizer.save_pretrained("tokenfile")

运行后触发错误:

TypeError: Object of type property is not JSON serializable

完整错误回溯:

TypeError                                 Traceback (most recent call last)
Cell In[x], line 3
      1 # Save the fine-tuned model
----> 3 tokenizer.save_pretrained("tokenfile")

File /3tb/share/anaconda3/envs/ak_env/lib/python3.10/site-packages/transformers/tokenization_utils_base.py:2130, in PreTrainedTokenizerBase.save_pretrained(self, save_directory, legacy_format, filename_prefix, push_to_hub, **kwargs)
   2128 write_dict = convert_added_tokens(self.special_tokens_map_extended, add_type_field=False)
   2129 with open(special_tokens_map_file, "w", encoding="utf-8") as f:
-> 2130     out_str = json.dumps(write_dict, indent=2, sort_keys=True, ensure_ascii=False) + "\n"
   2131     f.write(out_str)
   2132 logger.info(f"Special tokens file saved in {special_tokens_map_file}")

File /3tb/share/anaconda3/envs/ak_env/lib/python3.10/json/__init__.py:238, in dumps(obj, skipkeys, ensure_ascii, check_circular, allow_nan, cls, indent, separators, default, sort_keys, **kw)
    232 if cls is None:
    233     cls = JSONEncoder
    234 return cls(
    235     skipkeys=skipkeys, ensure_ascii=ensure_ascii,
    236     check_circular=check_circular, allow_nan=allow_nan, indent=indent,
    237     separators=separators, default=default, sort_keys=sort_keys,
-> 238     **kw).encode(obj)

File /3tb/share/anaconda3/envs/ak_env/lib/python3.10/json/encoder.py:201, in JSONEncoder.encode(self, o)
    199 chunks = self.iterencode(o, _one_shot=True)
...
    178     """
-> 179     raise TypeError(f'Object of type {o.__class__.__name__} '
    180                     f'is not JSON serializable')

TypeError: Object of type property is not JSON serializable

错误原因

代码中tokenizer.pad_token = GPT2Tokenizer.eos_token这一行存在核心问题:

  • GPT2Tokenizer.eos_token是类的property属性,直接访问它得到的是一个property对象,而非实际的特殊标记字符串(比如GPT2默认的<|endoftext|>)。
  • 当调用tokenizer.save_pretrained()时,会将tokenizer的特殊标记映射序列化为JSON文件,property对象无法被JSON序列化,因此抛出错误。

解决方法

将赋值语句改为使用tokenizer实例的eos_token属性,这样获取到的是实际的字符串值,可正常序列化:

修正后的完整代码

from transformers import GPT2Tokenizer, GPT2LMHeadModel
import pandas as pd

tokenizer = GPT2Tokenizer.from_pretrained("gpt2")
# 改为使用实例的eos_token属性
tokenizer.pad_token = tokenizer.eos_token
dataset_file = "x.csv"
df = pd.read_csv(dataset_file, sep=",")
input_ids = tokenizer.batch_encode_plus(list(df["x"]), max_length=1024,padding='max_length',truncation=True)["input_ids"]

# 保存tokenizer
tokenizer.save_pretrained("tokenfile")

额外说明

如果需要直接指定pad token的字符串,也可以写成:

tokenizer.pad_token = "<|endoftext|>"

效果和使用tokenizer.eos_token一致,因为GPT2的默认eos token就是<|endoftext|>。


内容的提问来源于stack exchange,提问作者AKMalkadi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 12:10:54