图像的向量量化技术

创建嵌入矩阵的过程其实是将离散的索引(如单词索引、图像特征的类别标签等)映射到一个连续的向量空间,这个向量空间由一个嵌入矩阵来表示。在图像数据的背景下,我们可以通过神经网络将图像数据表示成离散的"类别"索引,然后用嵌入矩阵将这些索引转换成连续的向量,供模型后续使用。以图像数据为例,详细说明嵌入矩阵的创建和使用。

背景

假设我们正在处理图像数据,每张图片经过某种卷积网络(比如 VGG 或 ResNet)之后会输出一个特征图(feature map)。这些特征图本质上是图像的表示,可以看作是一个高维空间中的点。然而,这些特征仍然是连续的,我们希望将这些连续特征映射到离散的潜在空间,以便于后续的编码和解码过程。

为了实现这一点,可以使用量化(quantization)技术,将连续特征向量转换为离散表示。量化的过程通常包括以下步骤:

  1. 通过卷积网络提取图像特征。
  2. 将特征映射到一个离散的潜在空间(即找到离散的"编码")。
  3. 用一个嵌入矩阵将这些离散编码映射回向量表示。

(创建嵌入矩阵即码本(通过nn.embedding),将图像数据离散化(使用嵌入矩阵将图像的每个位置的特征"量化"成一个离散的索引,从嵌入矩阵中获取量化后的向量)

)

复制代码
import torch
import torch.nn as nn

# 1. 创建嵌入矩阵
num_embeddings = 4  # 假设我们有 4 个不同的编码
embedding_dim = 3  # 每个编码用一个 3 维的向量表示

embedding_matrix = nn.Embedding(num_embeddings, embedding_dim)

# 2. 假设这是我们通过卷积提取的特征图 (batch_size=2, channels=3, height=4, width=4)
image_features = torch.randn(2, 3, 4, 4)  # 随机生成特征图

# 3. 离散化特征(量化)
# 将特征图展平
flat_features = image_features.view(-1, embedding_dim)  # 展平特征图

# 计算每个特征与嵌入矩阵中所有向量的距离(欧几里得距离)
distances = torch.cdist(flat_features, embedding_matrix.weight)

# 找到距离最近的嵌入向量的索引
quantized_indices = torch.argmin(distances, dim=1)

# 4. 从嵌入矩阵中获取量化后的向量
quantized_embeddings = embedding_matrix(quantized_indices)

# 5. 打印嵌入矩阵和量化后的向量
print("嵌入矩阵:")
print(embedding_matrix.weight.data)

print("\n量化后的向量:")
print(quantized_embeddings)

说明:

  1. 嵌入矩阵 :nn.Embedding(num_embeddings, embedding_dim) 创建了一个大小为 (num_embeddings, embedding_dim) 的嵌入矩阵,表示每个编码的向量。

    • num_embeddings = 4 表示我们有 4 个不同的编码。
    • embedding_dim = 3 表示每个编码用 3 维向量表示。
  2. 图像特征 :我们模拟了一个形状为 (batch_size=2, channels=3, height=4, width=4) 的特征图 image_features,表示我们有 2 张图像,每张图像是一个 3 通道的 4x4 大小的特征图。

  3. 量化过程:

    • 首先通过 flat_features = image_features.view(-1, embedding_dim) 将特征图展平。
    • 然后通过 torch.cdist 计算每个展平后的特征与嵌入矩阵中所有向量的距离。
    • 通过 torch.argmin(distances, dim=1) 找到距离最小的编码索引。
  4. 获取量化后的向量:用计算得到的索引从嵌入矩阵中提取对应的向量,得到量化后的向量。

输出示例:

假设嵌入矩阵初始化为随机值,输出类似如下:

复制代码
嵌入矩阵:
tensor([[-0.0781,  0.2711, -0.2414],
        [ 0.3993, -0.5498,  0.2632],
        [-0.3277,  0.1209, -0.1076],
        [ 0.4716, -0.0699, -0.4997]])

量化后的向量:
tensor([[-0.3277,  0.1209, -0.1076],
        [ 0.4716, -0.0699, -0.4997],
        [-0.3277,  0.1209, -0.1076],
        [ 0.3993, -0.5498,  0.2632]])

在这个例子中,输出的嵌入矩阵包含 4 个向量,每个向量有 3 个维度。量化后的向量 是根据计算出的索引从嵌入矩阵中提取的对应向量。这些向量将用于后续的任务,例如图像重建或其他下游任务。

总结

  1. 嵌入矩阵 (nn.Embedding)是将离散的标签(如图像的某些区域的类别标签)映射到一个连续的向量空间的工具。
  2. 在图像数据中,通常是先通过卷积网络提取特征图,然后将特征图映射到一个离散空间中(如通过量化),并用嵌入矩阵将这些离散表示转化为连续的向量表示。
  3. 嵌入矩阵的每一行都是一个向量,它们是通过训练学习到的,旨在使相似的输入在嵌入空间中距离较近。

通过这种方式,图像的特征得到了有效的表示,且这些表示是可以用于后续的任务(如图像生成、图像分类等)。

相关推荐
向哆哆18 分钟前
羊行为目标检测数据集:4类别、2,000张图像 | 目标检测
人工智能·yolo·目标检测·目标跟踪
如若12333 分钟前
【论文复现】CoFailMed:从零复现医学图像分割的共享失败审计,含完整代码流程与科研绘图
人工智能·python
赛博守夜人1 小时前
AI安全攻防与治理之十六:对抗样本、恶意文件与多模态攻击,AI 内容安全检测的真实盲区
人工智能·安全
罗西的思考1 小时前
【轻量化复刻大模型 / KIMI K3】KDA(Kimi Delta Attention):并行
人工智能·算法·机器学习
yh弓长2 小时前
Agent 的 ReAct、Plan、Execute、Reflection 模式
人工智能
GlobalInfo2 小时前
2026年全球机器人用超平执行器市场研究报告:市场规模达7.51亿美元,人形机器人商业化与轻量化运动控制需求推动行业增长
大数据·人工智能·数码相机·microsoft·机器人
冬奇Lab2 小时前
一天一个开源项目(第252篇):Lightpanda —— 用 Zig 从零写的 AI 专用无头浏览器,内存省 16 倍、速度快 9 倍
人工智能·开源·资讯
在努力的前端小白3 小时前
基于FastAPI+LangChain+LangGraph+Agent+多模态的AI Agent 有渔渔具网站
人工智能·langchain·vue·fastapi
锋行天下3 小时前
Langgraph-cli 本地构建失败,改用服务器docker构建的流程
人工智能·前端框架·全栈
释厄6233 小时前
群体投票双通道狭隘论——AI泡沫出清后的主角确权
人工智能