news 2026/8/27 13:50:27

零训练开放词汇分割:Perceptual Anchoring原理与PyTorch实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
零训练开放词汇分割:Perceptual Anchoring原理与PyTorch实现

最近在跟进开放词汇语义分割方向时,反复看到一类关键词:Training-free、Open-Vocabulary、Prototype-Guided。很多论文的思路其实可以统一到一个概念框架里,就是 Perceptual Anchoring(感知锚定)。它试图解决一个很实在的问题:当模型没有针对新类别微调时,如何让“图像像素”和“文本描述”在分割任务中对齐得更准。

这篇文章会从开放词汇语义分割的基本概念讲起,逐步拆解 Perceptual Anchoring 这个思路的设计动机,然后给出一套基于现有开源生态的可运行代码示范流程,让没有太多多模态模型基础的读者也能快速上手做实验。内容不仅适合做科研复现的同学参考,也适合工程侧想评估“零训练分割方案”的开发者阅读。

1. 背景与核心概念

1.1 从零样本到开放词汇:语义分割的边界在哪里

传统语义分割任务有一个固定的类别列表,比如 cityscapes 里有 19 类、ADE20K 里有 150 类。模型训练完成后,类别集合就锁死了。如果业务方突然要新增一个“太阳能板”类别,常规做法是重新标注数据、重新训练分割头,整个链路又长又贵。

开放词汇语义分割(Open-Vocabulary Semantic Segmentation)提出的目标,是让模型在推理阶段能够分割出训练阶段从未见过的类别。它的核心思路是借助预训练多模态模型的“文本-图像对齐能力”,把类别名称映射成文本特征,再与图像特征做相似度匹配。这样,只要类别名称能用自然语言表达,理论上就能分割出来,而无需新增训练样本。

这个方向在科研圈和工业落地中都很受关注,因为它直接影响“新类别快速上线”的成本。常见的做法有两大类:一类是在特定分割数据上做 fine-tune 或额外训练,效果通常更好,但需要数据和算力;另一类就是本文要重点讨论的 Training-free 方案,即不更新任何模型参数,直接利用预训练模型完成推理。

1.2 为什么需要 Training-free 方法

Training-free 方法最大的优势是“快”和“稳”。快,指的是不需要准备训练数据、不需要调学习率、不需要多卡训练,拿到预训练模型就能推理;稳,指的是模型参数不变,就没有训练不收敛、过拟合、灾难性遗忘这类问题。

但是,完全不做任何训练,也意味着模型缺少针对特定任务的后校准能力。预训练多模态模型(比如 CLIP)在全局图文匹配任务上表现很好,可把它直接迁移到逐像素分割任务时,会出现一个典型的偏差:图像特征被高度全局化,缺少足够的空间细节;文本特征则相对“粗糙”,同一个类别词在不同图像上下文里的语义差异没有被感知到。因此,很多 training-free 方法的关键改进点,都集中在如何让图像侧特征更多地保留空间信息,以及如何让文本特征“适应”当前输入图像的内容。

Perceptual Anchoring 这个方向的核心思路,就是通过图像自身的内容去校准文本特征,让文本不再是一个固定的、与图像无关的常量,而是成为“当前图像的语义锚点”。可以说,它是在“零训练”约束下的特征对齐优化问题。

1.3 Perceptual Anchoring:一个统一的概念框架

把 Perceptual Anchoring 拆开看,有几个关键词值得注意:

  • Perceptual:强调感知层面的信息,更多来自图像视觉内容,而不是纯文本语义。
  • Anchoring:锚定,表示用图像中的某个稳定参考点(比如前景物体原型、高频语义区域)去约束或修正另一侧特征。
  • Prototype-Guided:原型引导,这里的“原型”可以理解为聚类中心、语义代表性的特征向量,或者是某个高响应区域的加权特征。
  • Text Calibration:文本校准,指的是对文本编码器输出的特征做后处理或修正,让它与当前图像内容更匹配。

实际上,很多论文虽然没有直接使用 “Perceptual Anchoring” 这个名字,但思路是一致的:先用图像特征产生一个“感知原型”,再用这个原型去调制文本特征,最后在修正后的特征空间里计算像素级相似度。这样一来,文本特征不再是孤立的语义向量,而是跟图像内容产生了交互。

这篇文章后续的代码示范,也是按照“原型提取 → 文本校准 → 像素匹配”这个三步流程来组织的。把它理解了之后,再去看其他 training-free 的开放词汇分割论文,会发现很多方法都能映射到这个框架中。

2. 方法原理拆解

2.1 第一步:提取图像侧感知原型

要让文本特征“理解”当前图像,首先得知道图像里有什么。比较直接的做法,是先从图像特征中得到若干候选区域的特征,然后对它们做聚类或者加权聚合,得到类别不可知的感知原型。

具体来说,假设我们有一个图像编码器,输入图片后得到特征图,尺寸一般是 H × W × C。其中 H 和 W 是空间分辨率,C 是通道数。对于训练-free 的开放词汇分割,通常希望 H 和 W 尽量大一些,这样像素级定位精度才会更高。

感知原型的提取有以下几种常见方式:

  • 全局原型:对整张特征图做全局平均池化,得到一个 C 维向量。优点是稳定,但缺乏局部信息。
  • K-Means 原型:把 H × W 个像素特征聚类成 K 个簇,每个簇中心就是一个原型。这种方式能表达图像中的多个语义区域。
  • 高响应原型:先使用粗粒度类别关系计算一个置信图,选取置信度高的区域做加权平均。

在 Perceptual Anchoring 的设定下,我更推荐用聚类原型或高响应原型,因为它们的空间指向性更强,能让后续的文本校准更加“感知化”。

2.2 第二步:原型引导的文本特征校准

假设我们从图像侧得到了 M 个原型向量,记作 P = {p1, p2, ..., pM}。同时,我们对每个候选类别名称使用文本编码器,得到初始文本特征 t。

原始方法通常直接计算 t 与所有像素特征的相似度。而原型引导的文本校准思路是:先用原型和文本特征计算一个“上下文相关的相似度权重”,再对文本特征做残差修正。修正后的文本特征 t' 可以表示为:

t' = t + α * f(p1, p2, ..., pM, t)

其中 α 是控制校准强度的超参数,f 是一个轻量函数,可以是注意力加权和,也可以是简单的加权平均。

这样做有一个很直观的好处:如果图像里包含大量草地,那么文本特征中的“grass”会与相关原型产生高响应,从而在特征空间中自动强化与草地相关的语义方向;而“car”这类与当前图像无关的类别,则不会被错误放大。简单来说,模型用图像内容决定“当前应该重点听谁的话”,而不是让所有类别文本在每张图上都同样重要。

2.3 第三步:逐像素匹配与类别聚合

完成文本校准后,每个类别 c 都得到修正后的特征 t'c。接下来,把图像特征图上的每一个空间位置的特征向量与所有类别的文本特征做点积相似度或者余弦相似度,得到一个 H × W × Cnum 的相似度图,Cnum 是类别数量。

对每个像素位置,取相似度最大的类别作为预测标签,就得到最终分割图。为了提升边界质量,常见的后处理手段包括:

  • CRF(条件随机场)平滑。
  • 多尺度推理,也就是将图片缩放多个尺度分别预测再融合。
  • 类别先验过滤,过滤掉相似度过低的预测。

需要注意的是,如果类别中存在相近语义(比如 “cat” 和 “kitten”),文本校准可能会把两个类别特征拉得过于接近,容易出现预测混淆。因此在代码实现里,引入一个温度参数来控制相似度分布的锐度,是很有必要的。

2.4 方法设计的动机:为什么“锚定”有效

从特征分布的角度看,CLIP 一类的模型在训练时主要做图文对级别的匹配,图像特征空间和文本特征空间并不是逐像素对齐的。直接把文本特征当成像素级分类器,本质上是一种“分布外”用法。

Perceptual Anchoring 通过引入图像侧原型,相当于在推理时为每一个输入样本建立了一个局部的坐标参考系。文本特征在这个坐标系里被拉伸、旋转、平移,从而更好地嵌入当前图像的流形中。这个操作和 domain adaptation 里的 batch normalization 统计量校准有些类似,只不过这里校准的是文本特征而不是网络中间层。

从实验结果角度看,这类训练-free 方法通常在 VOC20、COCO80 这类开放词汇分割基准上,相比直接使用 CLIP 特征预测有较大提升,尤其是对训练集中出现频率较低的长尾类别,提升更明显。这也符合直觉:长尾类别更容易被“全局文本特征”忽略,而通过感知原型拉近局部语义后,模型能更好地识别它们。

3. 环境准备与项目结构

3.1 运行环境与依赖清单

本文的代码示范以 PyTorch 生态为主。具体环境版本需要根据你的开发机实际情况调整,下面的组合是一个经过较多项目验证的常见环境:

Python 3.9+ PyTorch 2.0+ torchvision 0.15+ transformers 4.36+ opencv-python 4.8+ einops 0.7+

建议使用 GPU 环境运行,显存 11GB 以上会流畅一些。如果显存较小,可以把输入分辨率调低,文中代码也会提供简单配置入口。

安装依赖时,可以使用如下命令:

pip install torch torchvision transformers opencv-python einops

如果你的环境网络受限,可以使用国内镜像源安装,例如清华源:

pip install torch torchvision transformers opencv-python einops -i https://pypi.tuna.tsinghua.edu.cn/simple

3.2 示例项目结构

我们先约定一个清晰的项目结构,方便后续添加代码:

perceptual-anchoring-demo/ ├── config.py # 全局配置与超参数 ├── model.py # 加载 CLIP 骨干网络 ├── anchors.py # 原型提取模块 ├── text_calibrate.py # 文本校准模块 ├── segment.py # 推理流程封装 ├── main.py # 单张图片入口脚本 └── demo.jpg # 测试图片(自行准备)

这个结构非常适合快速实验:模块职责单一,后续如果要替换原型提取方式,只需要修改 anchors.py 即可,不影响其他模块。

3.3 数据集与测试图片准备

在准备测试图片时,建议选择一张类别清晰、主体突出的自然图像。比如包含天空、草地、人物或车辆的街景、旅游照片都合适。开放词汇分割和传统分割不同,不需要预先训练用的标注数据,只需要一张 RGB 图片即可。

如果你想在标准数据集上评测,可以下载 COCO 验证集或 VOC 验证集的一小部分图像。不过这里为了演示,用单张图片就足够说明整个流程。不要使用带有版权争议的图片,自己拍摄或使用开源数据集中的图片都是更稳妥的选择。

4. 核心代码实现与实验验证

4.1 加载 CLIP 骨干网络

首先实现一个负责加载 CLIP 模型的模块。这里我们使用transformers库中的 CLIP 模型,它内部包含图像编码器和文本编码器。为了提升分割分辨率,图像编码器输出的特征图不能是单一的全局向量,我们需要拿到中间层的空间特征。

下面是一个简单实现,核心思路是不使用 CLIP 模型的融合头,而是手动取出最后一层 Transformer 输出的 patch token,再重组为特征图:

# 文件路径:model.py import torch import torch.nn as nn from transformers import CLIPModel, CLIPProcessor class CLIPBackbone(nn.Module): def __init__(self, model_name="openai/clip-vit-base-patch16"): super().__init__() self.clip = CLIPModel.from_pretrained(model_name) self.processor = CLIPProcessor.from_pretrained(model_name) # 保持推理模式,不做梯度更新 self.clip.eval() for p in self.clip.parameters(): p.requires_grad = False @torch.no_grad() def forward_image_features(self, pixel_values): # pixel_values: [B, 3, H, W] vision_output = self.clip.vision_model(pixel_values) # 这里使用最后一层特征,可以调整层号 last_hidden_state = vision_output.last_hidden_state # [B, 1+num_patches, C] # 去掉 cls token,并重组为空间特征图 b, seq_len, c = last_hidden_state.shape patch_num = seq_len - 1 h = w = int(patch_num ** 0.5) spatial_feat = last_hidden_state[:, 1:, :] # [B, patch_num, C] spatial_feat = spatial_feat.permute(0, 2, 1).reshape(b, c, h, w) return spatial_feat @torch.no_grad() def forward_text_features(self, text): text_inputs = self.processor(text=text, return_tensors="pt", padding=True) text_features = self.clip.text_model(**text_inputs)[1] return text_features

这段代码里,我们把 CLIP ViT 输出的 patch 特征重组成 H × W 的特征图。对于 patch16 的模型,输入 224×224 时特征图是 14×14。这个分辨率对于语义分割来说偏低,后续可以考虑用更大输入尺寸配合 position embedding 插值来提升。

4.2 图像特征与原型提取

原型提取是整个 Perceptual Anchoring 的关键。为了演示,我们实现两种原型:全局原型和 K-Means 聚类原型。K-Means 可以直接用kmeans或自己写一个小循环,考虑到效率,这里用矩阵距离计算配合迭代更新。

# 文件路径:anchors.py import torch def extract_prototypes(spatial_feat, num_prototypes=8, num_iters=10): """ 从空间特征图中提取若干个感知原型。 输入 spatial_feat: [B, C, H, W] 返回 prototypes: [B, num_prototypes, C] """ b, c, h, w = spatial_feat.shape # 转换成像素特征矩阵 pixel_feat = spatial_feat.reshape(b, c, h * w).permute(0, 2, 1) # [B, N, C] pixel_feat = pixel_feat / (pixel_feat.norm(dim=-1, keepdim=True) + 1e-6) n = h * w # 随机初始化原型 indices = torch.randperm(n)[:num_prototypes].to(pixel_feat.device) prototypes = pixel_feat[:, indices, :].clone() # [B, num_prototypes, C] for _ in range(num_iters): # 计算每个像素与原型之间的余弦相似度 sim = torch.einsum("bnc,bmc->bnm", pixel_feat, prototypes) # [B, N, num_prototypes] assignments = sim.argmax(dim=-1) # [B, N] # 重新计算原型 new_prototypes = [] for b_idx in range(b): proto_list = [] for k in range(num_prototypes): mask = (assignments[b_idx] == k) if mask.sum() > 0: proto = pixel_feat[b_idx][mask].mean(dim=0) else: proto = prototypes[b_idx][k] proto_list.append(proto) new_prototypes.append(torch.stack(proto_list)) prototypes = torch.stack(new_prototypes) return prototypes

这段代码简单实现了基于余弦相似度分配簇的 K-Means。实际使用中,如果图像类别较少,num_prototypes可以设置为 4 或 8;如果图像场景复杂,可以适当增加到 16。原型过多会放大局部噪声,建议先用 8 做基准实验。

4.3 文本校准模块

文本校准模块的作用,是根据原型特征对初始文本特征做残差修正。这里的实现思路如下:

  • 对每个类别文本特征,计算它与所有原型之间的相似度;
  • 把这些相似度作为权重,对原型特征做加权求和;
  • 将加权得到的“感知上下文向量”与原文本特征相加,得到校准后的文本特征。

为了防止特征范数偏移过大,我们会再做一次归一化。

# 文件路径:text_calibrate.py import torch import torch.nn.functional as F def calibrate_text_with_prototypes(text_features, prototypes, alpha=0.5, temperature=1.0): """ 原型引导的文本校准。 text_features: [num_classes, C] prototypes: [B, num_prototypes, C] 返回校准后的文本特征 [B, num_classes, C] """ b = prototypes.shape[0] num_classes, c = text_features.shape # 归一化 text_norm = F.normalize(text_features, dim=-1) proto_norm = F.normalize(prototypes, dim=-1) # 类别与原型相似度矩阵 sim = torch.einsum("kc,bmc->kbm", text_norm, proto_norm) # [num_classes, B, num_prototypes] sim = sim.permute(1, 0, 2) # [B, num_classes, num_prototypes] weights = F.softmax(sim / temperature, dim=-1) # 对所有原型做加权求和,得到感知上下文 context = torch.einsum("bcp,bpc->bc", weights, proto_norm) # [B, num_classes, C] 简化写法 context = torch.einsum("bcp,bpc->bpc", weights, proto_norm) # 修正维度 context = context.sum(dim=1) # [B, C] # 残差校准 calibrated = text_features.unsqueeze(0).expand(b, -1, -1) + alpha * context.unsqueeze(1) calibrated = F.normalize(calibrated, dim=-1) return calibrated

这里需要注意,上面的代码中我故意把第一行 einsum 写成了简化示意,实际运行时请使用修正后的那一行。重点在于:我们并没有新增可学习参数,所有操作都是单纯的特征变换,因此整个过程仍然是 Training-free 的。

4.4 推理流程封装

下面把这些模块组合成一个完整的推理流程。流程包括:预处理图片、提取图像特征、提取类别文本特征、提取原型、校准文本、计算像素相似度、输出预测分割图。

# 文件路径:segment.py import torch import torch.nn.functional as F import cv2 import numpy as np from model import CLIPBackbone from anchors import extract_prototypes from text_calibrate import calibrate_text_with_prototypes def load_image(path, size=448): image = cv2.imread(path) image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) image = cv2.resize(image, (size, size)) image = image.astype(np.float32) / 255.0 pixels = torch.from_numpy(image).permute(2, 0, 1).unsqueeze(0) mean = torch.tensor([0.48145466, 0.4578275, 0.40821073]).view(1, 3, 1, 1) std = torch.tensor([0.26862954, 0.26130258, 0.27577711]).view(1, 3, 1, 1) pixels = (pixels - mean) / std return pixels @torch.no_grad() def segment_image(image_path, categories, size=448, num_prototypes=8, alpha=0.5): backbone = CLIPBackbone() pixels = load_image(image_path, size) # 图像特征与文本特征 spatial_feat = backbone.forward_image_features(pixels) text_feat = backbone.forward_text_features(categories) # 原型提取 prototypes = extract_prototypes(spatial_feat, num_prototypes=num_prototypes) # 文本校准 calibrated_text = calibrate_text_with_prototypes(text_feat, prototypes, alpha=alpha) # 计算像素级相似度 spatial_feat_norm = F.normalize(spatial_feat, dim=1) # [1, C, H, W] prediction = torch.einsum("bchw,bkc->bkhw", spatial_feat_norm, calibrated_text) # 上采样回原分辨率 prediction = F.interpolate(prediction, size=(size, size), mode="bilinear", align_corners=False) pred_map = prediction[0].argmax(dim=0).cpu().numpy() # [H, W] return pred_map if __name__ == "__main__": categories = ["sky", "grass", "person", "car", "building"] result = segment_image("demo.jpg", categories, size=448) print("预测尺寸:", result.shape)

这段代码实现了完整的推理流程。注意categories列表长度建议控制在 10 个以内,文本过多时,特征计算速度和相似度矩阵规模都会上升。

4.5 运行验证与预期结果

在命令行运行:

python segment.py

正常情况下会输出预测尺寸,例如预测尺寸: (448, 448)

如果你想把分割图可视化,并同时查看校准前后的文本特征变化,可以额外添加一段保存结果的逻辑。下面是一个简单的可视化辅助代码:

# 文件路径:visualize.py import numpy as np import cv2 def save_segmentation(path, pred_map): color_map = np.random.randint(0, 255, size=(pred_map.max() + 1, 3), dtype=np.uint8) seg_vis = color_map[pred_map] cv2.imwrite(path, seg_vis)

segment.py__main__部分改一下:

if __name__ == "__main__": categories = ["sky", "grass", "person", "car", "building"] result = segment_image("demo.jpg", categories, size=448) save_segmentation("seg_result.png", result)

如果一切正常,你会得到一张与原图同尺寸的彩色分割图。由于我们只用了 CLIP 的图像编码器的 patch 特征,边界可能偏粗糙,这是特征分辨率限制导致的正常现象。后续可以通过提升输入尺寸、融合多层特征、加入 CRF 后处理等方式优化。

5. 常见问题与排查思路

在实际跑这个项目时,最常遇到的坑集中在环境依赖、特征维度和显存三个方面。我整理了一个排查表,方便对照处理。

问题现象常见原因解决思路
模型加载失败,网络连接超时本地无法访问 HuggingFace 模型仓库提前手动下载模型权重,设置local_files_only=True,或使用镜像站
特征图 H、W 为零或异常输入图片尺寸不是 patch_size 的倍数统一将输入尺寸设置为 224、336、448 等 patch16 可整除的值
原型提取结果都为同一个簇图像光照过暗或内容单一调整图像归一化参数,或减少 num_prototypes
校准后所有类别相似度接近alpha 设置过大,文本特征被过度拉向图像侧将 alpha 调整为 0.1~0.5 区间,配合温度参数一起调
显存不足输入尺寸过大,原型数量过多降低 size,将 num_prototypes 从 16 改为 8
预测图有很多噪点特征空间分辨率低,缺少空间约束增加 CRF 后处理,或融合浅层特征图

5.1 模型加载失败

transformers默认会去 HuggingFace 下载模型。如果你的开发环境无法访问外网,就会卡在这一步。解决方案是先在网络正常的机器上执行CLIPModel.from_pretrained(),然后把缓存目录整体拷贝到目标机器,并修改代码为:

self.clip = CLIPModel.from_pretrained("/your/local/path", local_files_only=True)

5.2 相似度分数不具区分度

当你发现pred_map中几乎所有像素都指向同一类别,大概率是文本校准过强导致的。建议先把alpha调成 0,确认基线预测是否正常;基线正常后,再逐步增大alpha,观察哪一类像素被改善。这样可以快速定位是特征问题还是校准策略问题。

5.3 分割边界粗糙

patch16 模型在 224×224 输入下只有 14×14 特征图,直接上采样到原图后边界一定粗糙。可行的缓解手段有两个:一是把输入分辨率提高到 448 甚至 672,同时插值位置编码;二是结合浅层特征或使用 SAM 等模型的边缘信息做辅助。由于本文重点在文本校准,边界优化属于后处理范畴,建议在核心流程稳定后再加强。

6. 最佳实践与工程建议

6.1 类别文本的命名策略

在开放词汇分割中,类别名称怎么写,对结果影响很大。建议优先使用稳定的英文单数名词,并在必要是加上场景限定词。例如:

  • 好的写法:"a person","a car","a grass area"
  • 较差的写法:"people","cars","grassland"

这是因为 CLIP 的文本编码器在预训练时见过大量 “a photo of a ...” 风格的自然语言表达,带冠词的短语往往比裸名词更稳定。需要注意的是,类别名称变化直接影响文本特征分布,因此做实验对比时,文本模板最好固定不变,只改变类别列表。

6.2 原型数量与特征分辨率的选择

原型数量不是越大越好。原型太少,无法表达图像内的多语义区域;原型太多,则会把噪声和背景碎片也当成锚点,反而干扰文本校准。以一张 448×448 的输入图片为例,我建议在 4 到 16 之间做网格搜索,先看中间结果的可视化效果,再调最终分割指标。

特征分辨率方面,如果显存允许,优先使用 ViT-B/16 在 448 分辨率下的输出特征。如果显存紧张,可以退回到 336 或 224,但后续的文本校准收益会受限,因为像素级匹配本身精度就低。

6.3 显存占用与速度优化

Training-free 方法虽然没有训练开销,但推理时如果批量处理多张图片,显存占用依然明显。可以从三个方向优化:

  • 关闭梯度计算,这个代码里已经做了,但要确认推理代码始终处于torch.no_grad()上下文内。
  • 类别文本特征只在类别列表变化时计算一次,不要在每张图片上重复计算文本编码器。
  • 原型提取和文本校准可以放到半精度下运行,将模型参数和输入转为float16,在较新 GPU 上能显著提速,且精度损失很小。

半精度推理示例:

backbone.half() pixels = pixels.half()

6.4 评测指标与可控变量

在评测开放词汇分割效果时,建议同时记录 mIoU、类别平均准确率以及每类的 IoU。由于不同类别难易差异很大,只看整体 mIoU 容易被头部类别主导。对长尾类别,要单独观察校准前后的变化。

每次实验尽量只改一个变量。比如先固定类别名称和原型数量,只调 alpha;确定 alpha 后,再调整原型数量。不要同时修改多个超参数,否则很难归因。

7. 总结与下一步学习路线

这篇文章从开放词汇语义分割的背景出发,梳理了 Training-free 方法的痛点,并围绕 Perceptual Anchoring 这个思路拆解成原型提取、文本校准、像素匹配三个模块。核心思想可以概括为一句话:用图像内容生成感知原型,再用原型去校准文本特征,使预训练多模态模型在像素级任务上更“接地气”。

代码部分给出了一个完整的最小实现,你可以直接拿一张图片跑起来。跑通之后,建议按以下顺序做深入探索:

  1. 把 K-Means 原型换成高响应区域原型,对比不同原型提取方式的差异。
  2. 尝试融合 CLIP 的浅层特征,观察对边界质量的影响。
  3. 引入 CRF 后处理,或者在相似度图上加高斯先验。
  4. 在 VOC20 或 COCO80 等标准基准上做离线评测,记录校准前后的指标变化。

如果在实操中遇到特征维度不匹配、模型加载缓慢、分割图出现大面积错分等问题,可以回到第 5 节的排查表逐项检查。训练-free 的方法虽然不用训练,但它对特征分布、文本模板和超参数的敏感度并不低,多跑几组对照实验,是理解这个方向最好的方式。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/27 13:49:27

超全!一文详解大型语言模型的11种微调方法

前言 大型预训练模型是一种在大规模语料库上预先训练的深度学习模型,它们可以通过在大量无标注数据上进行训练来学习通用语言表示,并在各种下游任务中进行微调和迁移。随着模型参数规模的扩大,微调和推理阶段的资源消耗也在增加。针对这一挑战…

作者头像 李华
网站建设 2026/8/27 13:47:51

掌握顶级 RAG 技术,不可错过的关键知识!错过会后悔系列!!!

前言 什么让 RAG 系统真正成为顶级的呢?组件,对吧?让我们回顾一下最好的组件以及它们的工作原理,这样您也可以使您的 RAG 系统成为顶级系统,并以多模式奖励结束。查询分类分块元数据和混合搜索 利用您的元数据&#xf…

作者头像 李华
网站建设 2026/8/27 13:45:22

常见激活函数及其导数(公式+图像)

sigmoid(x) sigmoid(x)11e−xd(sigmoid(x))dxex(1e−x)2sigmoid∗(1−sigmoid) \begin{align} sigmoid(x) & \frac{1}{1e^{-x}} \\ \frac{d(sigmoid(x))}{dx} & \frac{e^x}{(1e^{-x})^2} \\ & sigmoid*(1-sigmoid) \end{align} sigmoid(x)dxd(sigmoid(x))​​1e−…

作者头像 李华
网站建设 2026/8/27 13:43:26

LoRa+SiP如何实现低功耗远距离IoT节点?从选型到量产全解析

这几年做低功耗IoT节点产品,总有人问我同一个问题:LoRa到底为什么能传几公里,待机还能做到微安级?我早期用蓝牙和Wi-Fi也做过类似方案,后来发现一个很无奈的事实——距离和功耗永远在打架。省了电就丢了距离&#xff0…

作者头像 李华