matplotlib画图、标点、打标签

本文详细介绍使用Python的matplotlib和numpy库进行函数图形绘制的方法,包括如何调整坐标轴、标注关键点及其坐标,并通过虚线突出显示。同时,介绍了如何为图形添加标题、保存图片,以及如何将坐标轴调整到原点位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Rendering

这是想要的效果:
function-point-label

Notes

记录几个功能的做法:

  • 函数作图
  • 座标轴(下、左边框)移到过原点,上、右边框去掉
  • 标出一个点
  • 虚线描出这个点的横、纵坐标所在
  • 给这个点打标签
  • 图片标题
  • 保存

Code

import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure()

# 函数图
x = np.arange(0, 3, 0.01)
y = x ** 2 - 3 * x + 2
plt.plot(x, y)

# 标题
plt.title('x^2 - 3x + 2')

# 标点
plt.scatter([1.5], [-0.25], s=25, c='r')  # stroke, colour

# 虚线定位:两点确定一条直线
plt.plot([0, 1.5], [-0.25, -0.25], c='b', linestyle='--')
plt.plot([1.5, 1.5], [0, -0.25], c='b', linestyle='--')

# 点的标签(座标中加减的 `0.15` 是显示位置的偏移,避免挡住点)
plt.text(1.5+0.15, -0.25-0.15, 'minima', ha='center', va='bottom', fontsize=10.5)  # horizontal alignment
# 座标轴调位
ax = plt.gca()
# 去掉上、右边框
ax.spines['top'].set_color('none')
ax.spines['right'].set_color('none')
# 移到原点
ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')
ax.spines['bottom'].set_position(('data', 0))
ax.spines['left'].set_position(('data', 0))

# 显示、保存
plt.show()
fig.savefig('fun.png')
# load checkpoints,如何上线 model = Sequence2Sequence(len(src_word2idx), len(trg_word2idx)) model.load_state_dict(torch.load(f"./best.ckpt", weights_only=True,map_location="cpu")) class Translator: def __init__(self, model, src_tokenizer, trg_tokenizer): self.model = model self.model.eval() # 切换到验证模式 self.src_tokenizer = src_tokenizer self.trg_tokenizer = trg_tokenizer def draw_attention_map(self, scores, src_words_list, trg_words_list): """绘制注意力热力图 Args: - scores (numpy.ndarray): shape = [source sequence length, target sequence length] """ plt.matshow(scores.T, cmap='viridis') # 注意力矩阵,显示注意力分数值 # 获取当前的轴 ax = plt.gca() # 设置热图中每个单元格的分数的文本 for i in range(scores.shape[0]): #输入 for j in range(scores.shape[1]): #输出 ax.text(j, i, f'{scores[i, j]:.2f}', # 格式化数字显示 ha='center', va='center', color='k') plt.xticks(range(scores.shape[0]), src_words_list) plt.yticks(range(scores.shape[1]), trg_words_list) plt.show() def __call__(self, sentence): sentence = preprocess_sentence(sentence) # 预处理句子,标点符号处理等 encoder_input, attn_mask = self.src_tokenizer.encode( [sentence.split()], padding_first=True, add_bos=True, add_eos=True, return_mask=True, ) # 对输入进行编码,并返回encode_piadding_mask encoder_input = torch.Tensor(encoder_input).to(dtype=torch.int64) # 转换成tensor preds, scores = model.infer(encoder_input=encoder_input, attn_mask=attn_mask) #预测 trg_sentence = self.trg_tokenizer.decode([preds], split=True, remove_eos=False)[0] #通过tokenizer转换成文字 src_decoded = self.src_tokenizer.decode( encoder_input.tolist(), split=True, remove_bos=False, remove_eos=False )[0] #对输入编码id进行解码,转换成文字,为了画图 self.draw_attention_map( scores.squeeze(0).numpy(), src_decoded, # 注意力图的源句子 trg_sentence # 注意力图的目标句子 ) return " ".join(trg_sentence[:-1])这段代码有什么用
最新发布
03-14
<think>好的,我现在需要分析用户提供的代码段,并解释它的用途。首先,用户的问题是关于如何加载检查以及上线模型,代码中展示了加载模型、定义Translator类以及翻译和绘制注意力机制的过程。让我一步步拆解这段代码的作用。 首先,用户提供的代码分为两个主要部分:加载预训练模型和使用Translator类进行翻译。我需要理解每一部分的功能,然后综合起来解释整体作用。 第一部分是加载模型检查。代码中使用了PyTorch的load_state_dict方法,从文件"./best.ckpt"加载模型参数。注意到参数weights_only=True和map_location="cpu",这可能是因为在推理时不需要GPU,或者确保模型加载到CPU上。这一步的作用是恢复之前训练好的模型参数,确保模型具备预测能力。 接下来是Translator类的定义。该类初始化时接收模型、源语言和目标语言的tokenizer。在__init__方法中,调用model.eval()将模型设置为评估模式,这会影响某些层的行为,如Dropout和BatchNorm层在推理时的表现。 Translator类中的draw_attention_map方法用于绘制注意力热力图。它接收scores(注意力分数)、源句子词汇和目标句子词汇,使用matplotlib生成热力图,并在每个单元格显示分数值。这里需要注意,scores的维度是[source length, target length],这可能表示源序列到目标序列每个位置的注意力权重。热力图的展示有助于直观理解模型在翻译时的关注。 然后是__call__方法,它处理输入句子的整个翻译流程。首先对输入句子进行预处理,使用src_tokenizer进行编码,生成encoder_input和attn_mask。这里可能包括添加BOS/EOS标记,填充(padding)以及生成注意力掩码。接着,将输入转换为Tensor,并调用model.infer方法进行预测,得到预测结果preds和注意力分数scores。 之后,使用trg_tokenizer解码preds,得到目标语言句子。同时,解码encoder_input以获取源句子的词汇列表,用于绘制注意力图。最后,调用draw_attention_map展示注意力,并返回处理后的目标句子(可能移除了EOS标记)。 总结各部分的功能:加载训练好的模型,定义翻译器类处理输入句子,生成翻译结果并可视化注意力机制。整个代码的作用是实现一个序列到序列(如机器翻译)模型的推理流程,包括加载模型、预处理输入、推理、后处理输出,以及可视化模型内部注意力机制,帮助理解模型的工作方式。 需要验证是否正确处理了输入输出的维度,比如tokenizer的encode和decode是否正确处理序列长度,以及infer方法返回的scores是否与源和目标序列长度匹配。此外,绘制注意力图时是否转置了维度,确保横纵轴对应正确。用户可能关心如何实际部署模型上线,这段代码可能是一个简单的示例,实际部署可能需要考虑性能优化、API封装等,但当前代码更多是展示推理过程及可视化。</think>这段代码实现了一个基于序列到序列(Sequence-to-Sequence)模型的**翻译器**,支持加载预训练模型、执行翻译任务,并可视化注意力机制。以下是逐步解析: --- ### **1. 加载模型检查** ```python model = Sequence2Sequence(len(src_word2idx), len(trg_word2idx)) model.load_state_dict(torch.load("./best.ckpt", weights_only=True, map_location="cpu")) ``` - **作用**:从文件 `best.ckpt` 加载预训练模型的参数。 - **关键**: - `weights_only=True` 确保只加载模型权重,避免潜在的安全风险。 - `map_location="cpu"` 强制将模型加载到 CPU(即使训练时用 GPU)。 --- ### **2. Translator 类的功能** #### **初始化** ```python class Translator: def __init__(self, model, src_tokenizer, trg_tokenizer): self.model = model self.model.eval() # 禁用 Dropout 和 BatchNorm self.src_tokenizer = src_tokenizer # 源语言分词器(如英语) self.trg_tokenizer = trg_tokenizer # 目标语言分词器(如中文) ``` - **作用**:初始化翻译器,设置模型为推理模式,绑定分词器。 --- #### **翻译流程 (`__call__` 方法)** 1. **预处理输入句子** ```python sentence = preprocess_sentence(sentence) # 清理标点、大小写等 ``` 2. **编码输入** ```python encoder_input, attn_mask = self.src_tokenizer.encode(...) ``` - 将文本转换为模型可理解的 Token ID。 - `padding_first=True` 表示在序列前端填充(Padding)。 - `add_bos=True` 和 `add_eos=True` 添加句首(BOS)和句尾(EOS)标记。 3. **执行推理** ```python preds, scores = model.infer(encoder_input, attn_mask) ``` - 生成目标语言的 Token ID (`preds`) 和注意力分数 (`scores`)。 4. **解码输出** ```python trg_sentence = self.trg_tokenizer.decode([preds], ...) ``` - 将 Token ID 转换为可读文本,移除 EOS 标记(`remove_eos=False` 保留)。 5. **可视化注意力** ```python self.draw_attention_map(scores, src_decoded, trg_sentence) ``` --- #### **注意力热力图 (`draw_attention_map`)** - **输入**:注意力分数矩阵 `scores`,形状为 $[L_{\text{src}}, L_{\text{trg}}]$。 - **可视化**: - 使用 `plt.matshow` 绘制热力图,横轴为源语言词汇,纵轴为目标语言词汇。 - 每个单元格显示注意力分数(保留两位小数)。 --- ### **3. 代码用途总结** 1. **模型部署**:加载预训练模型,用于离线或在线翻译服务。 2. **翻译流程**: - 输入句子 → 预处理 → 编码 → 模型推理 → 解码 → 输出翻译结果。 3. **可解释性分析**: - 通过注意力热力图,直观展示模型在翻译时如何关注源句子的不同部分(例如对齐名词、动词)。 --- ### **4. 典型应用场景** - **机器翻译系统**:如英译中、中译英。 - **模型调试**:通过注意力图检查模型是否合理对齐词汇。 - **教学演示**:展示 Seq2Seq 模型的工作原理。 --- ### **注意事项** - **分词器匹配**:需确保 `src_tokenizer` 和 `trg_tokenizer` 与训练时使用的分词器一致。 - **性能优化**:上线时可能需要将模型转换为 `torchscript` 或使用 ONNX 加速推理。 - **错误处理**:实际部署需添加异常处理(如无效输入、模型加载失败)。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值