报错:ValueError: too many values to unpack (expected 2)
复现RGCL模型,遇到的问题,该代码里面报错原因是:collate_fn里的tokens是多层嵌套列表(每个样本是分词后的 token 列表,batch 打包后变成[[token1,token2...], [xxx]]),但旧版 transformers(3.1.0)在is_pretokenized=True时内部解包逻辑不兼容,或者数据里混入了非法空样本、维度错乱。
解决方案
原 collate_fn:
def collate_fn(data): u, i, r, tokens = zip(*data) encoding = bert_tokenizer(tokens, return_tensors='pt', padding=True, truncation=True, is_pretokenized=True) return torch.Tensor(u), torch.Tensor(i), torch.Tensor(r), \ encoding['input_ids'], encoding['attention_mask']改成下面版本,去掉is_pretokenized=True,改用字符串拼接 / 直接传原文本,彻底规避解包 bug:
def collate_fn(data): u, i, r, token_lists = zip(*data) # 把分词列表还原成字符串,不用is_pretokenized text_list = [" ".join(toks) for toks in token_lists] encoding = bert_tokenizer(text_list, return_tensors='pt', padding=True, truncation=True, max_length=args.review_max_length) return torch.Tensor(u), torch.Tensor(i), torch.Tensor(r), \ encoding['input_ids'], encoding['attention_mask']infact,在修改代码之前,我还多次尝试改变transformers的版本但是还是报一样的错误,可能是没有改到正好可以用的那个版本。(ps.之前跑自己的模型也遇到过版本问题,修改transformers的版本就重新运行了)
完整报错:
(base) root@autodl-container-6d25459816-01b42b10:~/Work/ReviewGraph-main/BERT# python bert_whitening.py libgomp: Invalid value for environment variable OMP_NUM_THREADS 2026-07-06 00:23:43 - Load_Data - Start reading data to pandas. Clean string: 100%|███████████████████████████████████████████████████████████████████████| 963441/963441 [01:36<00:00, 9971.91it/s] Delete unused words: 100%|██████████████████████████████████████████████████████████████| 963441/963441 [00:08<00:00, 107299.97it/s] 2026-07-06 00:25:55 - Load_Data - Truncate review length to 56 words Delete unused words: 100%|██████████████████████████████████████████████████████████████| 963441/963441 [00:03<00:00, 255554.45it/s] check data split: 770753it [00:33, 23069.12it/s] /root/Work/ReviewGraph-main/BERT/../load_data.py:190: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead. train_data = train_data.append([valid_data.loc[valid_drop_user_data_index], pre tokenize: 100%|███████████████████████████████████████████████████████████████████████| 973763/973763 [09:04<00:00, 1789.32it/s] 0%| | 0/7608 [00:00<?, ?it/s] Traceback (most recent call last): File "bert_whitening.py", line 175, in <module> save_sentence_feat(args) File "/root/miniconda3/lib/python3.8/site-packages/torch/autograd/grad_mode.py", line 27, in decorate_context return func(*args, **kwargs) File "bert_whitening.py", line 149, in save_sentence_feat for u, i, r, input_ids, mask in tqdm(data_loader): File "/root/miniconda3/lib/python3.8/site-packages/tqdm/std.py", line 1185, in __iter__ for obj in iterable: File "/root/miniconda3/lib/python3.8/site-packages/torch/utils/data/dataloader.py", line 530, in __next__ data = self._next_data() File "/root/miniconda3/lib/python3.8/site-packages/torch/utils/data/dataloader.py", line 570, in _next_data data = self._dataset_fetcher.fetch(index) # may raise StopIteration File "/root/miniconda3/lib/python3.8/site-packages/torch/utils/data/_utils/fetch.py", line 52, in fetch return self.collate_fn(data) File "bert_whitening.py", line 100, in collate_fn encoding = bert_tokenizer(tokens, return_tensors='pt', padding=True, File "/root/miniconda3/lib/python3.8/site-packages/transformers/tokenization_utils_base.py", line 3021, in __call__ encodings = self._call_one(text=text, text_pair=text_pair, **all_kwargs) File "/root/miniconda3/lib/python3.8/site-packages/transformers/tokenization_utils_base.py", line 3109, in _call_one return self.batch_encode_plus( File "/root/miniconda3/lib/python3.8/site-packages/transformers/tokenization_utils_base.py", line 3311, in batch_encode_plus return self._batch_encode_plus( File "/root/miniconda3/lib/python3.8/site-packages/transformers/tokenization_utils.py", line 886, in _batch_encode_plus ids, pair_ids = ids_or_pair_ids ValueError: too many values to unpack (expected 2)