使用to_tf_dataset()遇TypeError: 'NoneType'对象不可下标问题求助
问题描述
尝试使用自定义Tokenizer训练Transformer,代码如下:
def tokenization(examples): tokenized_examples = tokenizer.encode_plus( examples["text"], add_special_tokens=True, return_attention_mask=True, padding=True, truncation=True, pad_to_max_length=True, max_length=MAX_LENGTH, return_tensors='tf', return_token_type_ids=True ) tokenized_dataset = dataset.map( tokenization, remove_columns=["text"], ) collater = DataCollatorForLanguageModeling(tokenizer=tokenizer, return_tensors="tf") train = tokenized_dataset['train'].to_tf_dataset( columns=["input_ids", "token_type_ids", "attention_mask"], label_cols=["labels"], batch_size=TRAIN_BATCH_SIZE, shuffle=True, collate_fn=collater )
运行后报错:TypeError: 'NoneType' object is not subscriptable
解决方案
1. 修复tokenization函数的返回值问题
这是报错的核心原因:你的tokenization函数没有返回任何处理后的结果,调用dataset.map()后得到的tokenized_dataset是None,尝试访问tokenized_dataset['train']时就会触发NoneType下标访问错误。
修改后的tokenization函数:
def tokenization(examples): tokenized_examples = tokenizer.encode_plus( examples["text"], add_special_tokens=True, return_attention_mask=True, padding=True, truncation=True, pad_to_max_length=True, max_length=MAX_LENGTH, return_tensors='tf', return_token_type_ids=True ) # 必须返回处理后的字典 return tokenized_examples
2. 额外注意事项
- 确保你的自定义Tokenizer已经正确初始化,包含必要的特殊token(如
<bos>、<eos>、<pad>、<mask>),否则DataCollatorForLanguageModeling无法正常生成labels。 - 如果你是在做文本分类任务而非自监督语言建模,那么
DataCollatorForLanguageModeling并不适用,需要替换为DataCollatorWithPadding,同时你的数据集需要包含label列,而非依赖整理器生成labels。
内容的提问来源于stack exchange,提问作者user24187564
相关产品推荐
相关产品推荐

