自动模型方式 - 特征提取任务
1 课程概览
本课讲解自动模型方式进行特征提取。流程和思路与文本分类差不多:加载 Tokenizer → 加载模型 → 文本转张量 → 送给模型。特征提取属于不带任务头输出,输出是半成品(一个矩阵),需要结合后续内容再做处理。使用 BERT base chinese 模型。
2 核心概念与定义
- 特征提取(Feature Extraction):提取文本的特征,半成品。
- 不带任务头输出:半成品,输出是一个矩阵,需要结合后续内容。
- encode_plus():分词器的编码函数。
- input_ids:文本的 id 序列。
- token_type_ids:文本的 token 序列。
- attention_mask:注意力掩码。
3 模型与算法详解
特征提取流程
1. 加载 Tokenizer(分词器)
2. 加载模型
3. 文本转张量
4. 送给模型
5. 输出特征(半成品)
带头 vs 不带任务头
| 类型 | 说明 | 输出 |
|---|---|---|
| 带头任务头 | 成品 | 具体结果 |
| 不带任务头 | 半成品 | 矩阵(特征) |
模型选择
使用 BERT base chinese 模型。
| 任务 | 模型 |
|---|---|
| 特征提取 | bert-base-chinese |
encode_plus() 参数
| 参数 | 说明 |
|---|---|
text | 待处理的文本 |
return_tensors='pt' | 返回二维张量 |
padding | 是否填充 |
truncation | 是否截断 |
max_length | 最大长度 |
返回值(字典形式)
返回字典形式,包含三个键。
| 键 | 说明 |
|---|---|
input_ids | 文本的 id 序列(对应 vocab.txt) |
token_type_ids | 文本的 token 序列 |
attention_mask | 注意力掩码 |
4 数学原理与推导
特征提取
$$\text{features} = \text{model}(\text{input_ids}, \text{attention_mask})$$
其中:
- $\text{input_ids}$ 是文本的 id 序列
- $\text{attention_mask}$ 是注意力掩码
- $\text{features}$ 是提取的特征(矩阵)
文本转张量
$$\text{inputs} = \text{tokenizer}.\text{encode_plus}(\text{text}, \text{return_tensors}='pt')$$
5 代码示例
import torch
from transformers import AutoModel, AutoTokenizer
def dm02_feature_extraction():
"""自动模型方式:特征提取"""
model_path = "C:/software/softwallg/pretrained_model/bert-base-chinese"
# 1. 加载 Tokenizer(分词器)
my_tokenizer = AutoTokenizer.from_pretrained(model_path)
# 2. 加载模型
my_model = AutoModel.from_pretrained(model_path)
# 3. 文本转张量
messages = ["你是谁", "人生该如何起头"]
for message in messages:
# 使用 encode_plus 编码
message_tensor = my_tokenizer.encode_plus(
text=message, # 待处理的文本
return_tensors='pt', # 返回二维张量
padding=True, # 是否填充
truncation=True, # 是否截断
max_length=30 # 最大长度
)
print(f"输入文本: {message}")
print(f"返回字典的键: {list(message_tensor.keys())}")
print(f"input_ids: {message_tensor['input_ids']}")
print(f"token_type_ids: {message_tensor['token_type_ids']}")
print(f"attention_mask: {message_tensor['attention_mask']}")
# 4. 送给模型
my_model.eval()
with torch.no_grad():
output = my_model(**message_tensor)
print(f"输出特征维度: {output.last_hidden_state.shape}")
print("-" * 50)
return my_model
# 测试
if __name__ == "__main__":
print("=== 自动模型方式:特征提取 ===")
model = dm02_feature_extraction()
代码说明
| 代码 | 说明 |
|---|---|
AutoTokenizer.from_pretrained() | 加载分词器 |
AutoModel.from_pretrained() | 加载模型 |
my_tokenizer.encode_plus(...) | 文本转张量 |
return_tensors='pt' | 返回二维张量 |
my_model(**inputs) | 送给模型 |
output.last_hidden_state | 输出特征 |
6 重难点与易错提醒
- ❗重点:特征提取属于不带任务头输出,是半成品。
- ❗重点:返回字典形式,包含 input_ids、token_type_ids、attention_mask。
- ❗重点:使用 encode_plus() 编码。
- ⚠️易错:
return_tensors='pt'返回二维张量,不加返回一维列表。 - 💡深入理解:特征提取输出是一个矩阵,需要结合后续内容。
7 课堂问答精选
Q1:特征提取属于带头还是不带任务头?
A:不带任务头。输出是半成品(一个矩阵),需要结合后续内容再做处理。
Q2:返回的字典包含哪些键?
A:①input_ids:文本的 id 序列;②token_type_ids:文本的 token 序列;③attention_mask:注意力掩码。
Q3:encode_plus() 有哪些参数?
A:①text:待处理的文本;②return_tensors='pt':返回二维张量;③padding:是否填充;④truncation:是否截断;⑤max_length:最大长度。
Q4:特征提取使用什么模型?
A:使用 bert-base-chinese 模型。
8 本课小结
- 特征提取:不带任务头输出,半成品(矩阵)。
- 流程:加载 Tokenizer → 加载模型 → 文本转张量 → 送给模型。
- 返回字典:input_ids、token_type_ids、attention_mask。
- 使用 encode_plus() 编码。
- 使用 bert-base-chinese 模型。
9 延伸思考
- 自动模型方式如何进行完形填空?
- 完形填空任务有什么特点?