使用return_tensors="tf"生成BERT嵌入时遇'EagerTensor'无'size'属性错误
解决HuggingFace Transformers中PyTorch模型与TensorFlow张量不兼容问题
问题描述
作为HuggingFace Transformers新手,编写了如下测试代码:
from transformers import BertTokenizer, BertModel tokenizer = BertTokenizer.from_pretrained('bert-base-uncased') model = BertModel.from_pretrained('bert-base-uncased') title = "Today is Monday" tokens = tokenizer([title], return_tensors="tf", truncation=True, padding=True) outputs = model(**tokens)
运行时抛出如下异常:
Traceback (most recent call last): File "/anaconda3/envs/recommenders/lib/python3.9/runpy.py", line 197, in _run_module_as_main return _run_code(code, main_globals, None, File "/anaconda3/envs/recommenders/lib/python3.9/runpy.py", line 87, in _run_code exec(code, run_globals) File "/root/.vscode-server/extensions/ms-python.python-2023.8.0/pythonFiles/lib/python/debugpy/adapter/../../debugpy/launcher/../../debugpy/__main__.py", line 39, in <module> cli.main() File "/root/.vscode-server/extensions/ms-python.python-2023.8.0/pythonFiles/lib/python/debugpy/adapter/../../debugpy/launcher/../../debugpy/../debugpy/server/cli.py", line 430, in main run() File "/root/.vscode-server/extensions/ms-python.python-2023.8.0/pythonFiles/lib/python/debugpy/adapter/../../debugpy/launcher/../../debugpy/../debugpy/server/cli.py", line 284, in run_file runpy.run_path(target, run_name="__main__") File "/root/.vscode-server/extensions/ms-python.python-2023.8.0/pythonFiles/lib/python/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_runpy.py", line 321, in run_path return _run_module_code(code, init_globals, run_name, File "/root/.vscode-server/extensions/ms-python.python-2023.8.0/pythonFiles/lib/python/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_runpy.py", line 135, in _run_module_code _run_code(code, mod_globals, init_globals, File "/root/.vscode-server/extensions/ms-python.python-2023.8.0/pythonFiles/lib/python/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_runpy.py", line 124, in _run_code exec(code, run_globals) File "/opt/nwdata/tests/recommenders/examples/00_quick_start/test.py", line 9, in <module> outputs = model(**tokens) File "/anaconda3/envs/recommenders/lib/python3.9/site-packages/torch/nn/modules/module.py", line 1130, in _call_impl return forward_call(*input, **kwargs) File "/anaconda3/envs/recommenders/lib/python3.9/site-packages/transformers/models/bert/modeling_bert.py", line 962, in forward input_shape = input_ids.size() File "/anaconda3/envs/recommenders/lib/python3.9/site-packages/tensorflow/python/framework/ops.py", line 437, in __getattr__ raise AttributeError(""" AttributeError: 'EagerTensor' object has no attribute 'size'. If you are looking for numpy-related methods, please run the following: from tensorflow.python.ops.numpy_ops import np_config np_config.enable_numpy_behavior()
将return_tensors设为"pt"时程序可正常运行,但后续需将结果用于TensorFlow程序,必须设置为"tf",需要解决该兼容问题。
解决方案
使用TensorFlow版本的BERT模型(推荐)
你当前导入的BertModel是PyTorch实现版本,仅支持PyTorch张量;而你生成的是TensorFlow张量,两者方法不兼容导致报错。直接替换为TensorFlow实现的TFBertModel即可,它原生支持TensorFlow张量,输出结果可直接用于后续TensorFlow程序:from transformers import BertTokenizer, TFBertModel tokenizer = BertTokenizer.from_pretrained('bert-base-uncased') # 加载TensorFlow版本的BERT模型 model = TFBertModel.from_pretrained('bert-base-uncased') title = "Today is Monday" tokens = tokenizer([title], return_tensors="tf", truncation=True, padding=True) outputs = model(**tokens)临时兼容方案(不推荐)
若因特殊原因必须使用PyTorch模型,可通过张量转换或启用TensorFlow numpy兼容行为解决,但会增加不必要的性能开销,且后续仍需将PyTorch输出转回TensorFlow张量:# 方法1:将TensorFlow张量转换为PyTorch张量,后续再转回TensorFlow import torch import tensorflow as tf tokens_pt = {k: torch.tensor(v.numpy()) for k, v in tokens.items()} outputs_pt = model(**tokens_pt) # 将PyTorch输出转回TensorFlow张量 outputs_tf = {k: tf.convert_to_tensor(v.detach().numpy()) for k, v in outputs_pt.items()} # 方法2:启用TensorFlow numpy兼容行为,解决size()方法报错 from tensorflow.python.ops.numpy_ops import np_config np_config.enable_numpy_behavior() outputs = model(**tokens)
内容的提问来源于stack exchange,提问作者Patrick Ng
相关产品推荐
相关产品推荐

