return_tensors

#deepLearning/returnTensors

Why we use return_tensors = "pt" during tokenization?

  • return_tensors (str or TensorTypeoptional) — If set, will return tensors instead of list of python integers. Acceptable values are:

    • 'tf': Return TensorFlow tf.constant objects.
    • 'pt': Return PyTorch torch.Tensor objects.
    • 'np': Return Numpy np.ndarray objects.
from transformers import AutoModelForCausalLM, AutoTokenizer

# Load model and tokenizer
model = AutoModelForCausalLM.from_pretrained(
"microsoft/Phi-3-mini-4k-instruct",
device_map="cuda",
torch_dtype="auto",
trust_remote_code=True,
)
tokenizer = AutoTokenizer.from_pretrained("microsoft/Phi-3-mini-4k-instruct")
prompt = "Write an email apologizing to Sarah for the tragic gardening mishap. Explain how it happened.%3C|assistant|%3E"

# Tokenize the input prompt
input_ids = tokenizer(prompt, return_tensors="pt").input_ids.to("cuda")

# Generate the text
generation_output = model.generate(
input_ids=input_ids,
max_new_tokens=20
)

# Print the output
print(tokenizer.decode(generation_output[0])

在Hugging Face的transformers库中,return_tensors参数用于指定分词器(Tokenizer)输出的数据格式。以下是其核心作用及使用原因的详细解释:


为什么需要张量(Tensor)?

深度学习框架(如PyTorch、TensorFlow)的核心计算单元是张量(多维数组),而非普通的Python列表或字典。
- 模型输入要求:预训练模型(如BERT、DeBERTa)的输入必须是张量格式,才能进行高效的矩阵运算和GPU加速。 - 性能优化:张量支持并行计算和自动微分,适合大规模数据处理和模型训练。


return_tensors的作用

通过设置return_tensors,可以控制分词器的输出格式,使其直接生成与深度学习框架兼容的张量,无需手动转换。

from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")

# 默认返回Python字典(包含列表)
tokens_list = tokenizer("Hello world")
print(tokens_list)
# 输出:{'input_ids': [101, 7592, 2088, 102], 'attention_mask': [1, 1, 1, 1]}

# 设置返回PyTorch张量('pt')
tokens_pt = tokenizer("Hello world", return_tensors="pt")
print(tokens_pt)
# 输出:{'input_ids': tensor([[101, 7592, 2088, 102]]), 'attention_mask': tensor([[1, 1, 1, 1]])}

# 设置返回TensorFlow张量('tf')
tokens_tf = tokenizer("Hello world", return_tensors="tf")
print(tokens_tf)
# 输出:{'input_ids': <tf.Tensor: shape=(1,4), dtype=int32, ...>, ...}

参数选项及适用场景

参数值 框架 适用场景
return_tensors='pt' PyTorch 使用PyTorch框架训练或推理时选择此选项。
return_tensors='tf' TensorFlow 使用TensorFlow/Keras框架时选择此选项。
return_tensors='np' NumPy 需要与NumPy兼容的库(如JAX)时选择此选项。
不设置(默认) Python原生 仅用于调试或手动处理数据(需后续转换)。

不设置return_tensors会怎样?

如果不设置此参数,分词器会返回普通的Python字典(包含列表),需手动转换为张量才能输入模型。
这会导致以下问题:

  • 额外代码:需手动调用torch.tensor()tf.convert_to_tensor()
  • 潜在错误:忘记转换会导致模型报错(如类型不匹配)。
  • 性能损失:无法直接利用GPU加速。

错误示例

# 未设置 return_tensors
tokens = tokenizer("Hello world")
output = model(tokens["input_ids"]) # 报错!模型期望张量输入,而非列表。

修复方法

# 正确做法:直接返回张量
tokens = tokenizer("Hello world", return_tensors="pt")
output = model(**tokens) # 直接输入张量,无需转换

实际应用场景

场景1:单条文本推理

text = "I love natural language processing."
tokens = tokenizer(text, return_tensors="pt") # 直接生成PyTorch张量
output = model(**tokens) # 输入模型

场景2:批量处理

batch_texts = ["Text 1", "Text 2", "Text 3"]
tokens = tokenizer(batch_texts, padding=True, truncation=True, return_tensors="pt")
output = model(**tokens)

总结

  • 核心目的return_tensors简化了数据预处理流程,确保输入格式与深度学习框架兼容。
  • 关键优势
    • 避免手动转换数据类型,减少代码冗余。
    • 直接支持GPU加速,提升计算效率。
    • 降低因格式错误导致的调试成本。
  • 新手建议:始终根据使用的框架设置return_tensors(如PyTorch用'pt'),以标准化输入流程。