Instance-Aware Hashing for Multi-Label Image Retrieval 解析

本文介绍了一种基于深度学习的方法来生成哈希码,旨在提高图像检索的效率。通过生成proposal、使用GoogLeNet提取特征、计算标签概率及哈希编码模型,实现了对多标签图像的有效检索。

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

链接:https://pan.baidu.com/s/165ZZJNROLkKzOAe7v-E53A  密码:w40x

 深度学习入门选了这篇文章和相应代码,纠结了两三个月,加上师兄讲解,现在才勉强搞懂,写出来,自己总结一下,也希望其他人少走点弯路,之后还会写一篇关于本文代码的博客。由于我是从小白开始的,所以这篇文章会尽可能清楚,请大牛们不要介意我唠叨。我写的有错的地方,欢迎大家留言,我更正。

文章目的和哈希码(hashing)

  讲文章目的之前,先讲一个概念,叫哈希(hashing)码。当初纠结好久,查了论文,现在就凭我自己的认知写吧,尽量直白。哈希码总的来说,就是用一串0、1码代表,在本文就是代表图片啦。文中有两种,一种叫语义哈希(Semantic Hashing)。以图1为例,给了查询图片,针对这张图生成一条语义哈希码,这条哈希码可以是32位,48位,64位等,在此以16位为例。假设生成的语义哈希码是这样0010001001011001,本文中的哈希码是保留相似性的哈希(Similarity-preserving hashing),相似图片生成的哈希码也是相似的。那么它可以对数据库中其他图片也用相同方式(后面会讲是什么方式)生成哈希码。假设还有一张图,哈希码是这样的0010001001010001,那么就可以认为这两张图片相似(只有一位哈希码不同),就得到了如下图1(5a)那样的结果。另一种叫Category-Aware哈希。这种哈希是重点。注意名字中的Category-Aware。种类已知。如下图1,给它一张图,经过吧啦吧啦的处理,它对每个种类,如下图的自行车和沙发各生成一条哈希码。一条哈希码代表自行车,那可以检索带自行车的图;另一条哈希码代表沙发,可以检索带沙发的图。文章的目的就是对多标签图片(一个图里面有多个object)生成这两种哈希码,可以用于检索。(作者给的代码里只生成哈希码,检索的代码要自己写,呜呜,就为这浪费了好几天)

图1

步骤

  从一幅图到一条哈希码(语义哈希)或多条哈希码(category-aware hashing)是怎样做到的呢?分四步,第一步,把冰箱门打开;第二步,把大象放进去。。。好啦,接下来是四个步骤。先看图吧。

图2.对多标签图像生成哈希码的深度结构。先接受一张图(假设该图所在数据集一共c类),接着生成N个proposals作为输入。先经过深度卷积子网络(GoogLeNet),通过SPP方法得到N个临时特征向量(每个临时特征向量针对一个proposal)。有了临时向量,接下来有两个分支:一个分支计算区域的标签概率(见图3),另一个分支生成proposal特征。

 

1.四部曲之生成proposal

proposal是什么呢,就是用算法处理图像,针对object把图像分割,这样提取的特征可以代表特定目标。如下图2红色部分就是proposal。也就是算法认为哪一块可能是一个object。本文中用了Geodesic object proposals(GOP)方法生成proposal。这个方法先不细讲了,以免影响大家对文章的整体理解。总之,把图像扔给GOP方法,它会给你多个proposal,就是它认为哪里可能是一个object。这多个proposal肯定会有重叠部分,不会像图2那么理想。其实生成的proposal是坐标的形式,左上角的横纵坐标和右下角的横纵坐标四个数字代表一个proposal。

图3.proposal

2.四部曲之深度卷积子网络

GooLeNet这个网络提取图像特征效果很好,作者就以它为基础。用它提取proposals的特征。但是我前面也讲了proposals个数很多,要是用户给了一张图,你针对这张图里生成的每个proposal都用GoogLeNet这种深度网络处理一遍,那黄花菜都凉了。这里,作者用到了另一种方法Spatial Pyramid Pooling(SPP)。SPP的好处是我们可以先把整张图用GooLeNet提取特征F,然后对每个proposal,直接根据F生成固定长度的表示。(可以理解为先计算整张图的特征F,需要哪块再从F中提取相应位置特征)。

3.四部曲之标签概率计算模型

  这个模型是干嘛的呢?前面不是一张图生成了多个proposal嘛,这个模型可以告诉你,每个proposal包含每个类的概率是多少。很厉害是不是,可是我们只有整幅图的标签呀,还拿图1那个自行车和沙发的图说事,根据标签,我们只知道图里有自行车和沙发,你怎么知道每个proposal有自行车或沙发的概率呢?作者用了一个厉害的办法,见图4.对一个有着N个proposals的图(c类),我们的工作是对每个proposal生成一个概率向量,这个向量有多长呢,c那么长,因为有c类呀。接下来如图4,N个proposal的概率向量就堆在一起,针对每一位,都选该列最大的拿出来,放到最后的概率向量里去。举个例子,N个proposal概率向量的第一位拿出来比,嗯,第3个proposal第一位的值最大,那就把这个值放到最后的概率向量去。这个方法叫什么cross-hypothesis max-pooling.图4最后那部分,不就可以代表整张图了么,因为你把它里面所有的proposals都包括了,正巧我们还有整幅图的标签,这就可以开始训练了呀。原谅我先不讲细节了,太痛苦。。。先讲个大致。

 图4.传说中的标签概率计算模型。

 

4.哈希编码模型

  终于要开始编码了,这部分两个任务,一个是把整幅图表示为1条哈希码,就是我们前面讲的语义哈希;另一个是表示为多条哈希码,每条哈希码和一个种类相关。种类已知哈希。(先写这些吧,过几天再陆续加)

 

 

 

 

 

 

 

 

 

### 面向方面的多头混合专家模型在顺序推荐系统中的实现与应用 #### 模型概述 面向方面(Facet-Aware)的多头混合专家(Mixture-of-Experts, MoE)模型旨在通过捕捉不同用户行为模式下的特定偏好来提高个性化推荐的效果。该方法利用多个子网络(即专家),每个专注于处理不同类型的信息片段或特征集,从而能够更细致地区分用户的兴趣点[^1]。 #### 架构设计 此架构由以下几个主要组件构成: - **输入层**: 接收来自序列化交互数据流作为输入; - **嵌入层(Embedding Layer)**: 将离散特征转换成连续空间内的低维表示形式; - **MoE 层 (Mixture of Experts Layers)** : 包含若干并行工作的专家模块以及一个门控机制(Gate Mechanism),用于决定哪些专家应该被激活参与预测过程;值得注意的是,在这里引入了aspect-aware的概念,意味着不同的专家可以针对具体的应用场景学习到更加专业的知识; - **融合层(Aggregation Layer)** :负责汇总各个活跃状态下的专家输出结果,并最终形成整体性的评分估计值; - **损失函数(Loss Function)** 和优化器(Optimizer): 定义目标并通过反向传播调整参数以最小化误差。 ```python import torch.nn as nn from transformers import BertModel class FacetAwareMHMoERecommender(nn.Module): def __init__(self, num_experts=8, hidden_size=768, aspect_embeddings=None): super().__init__() self.bert = BertModel.from_pretrained('bert-base-uncased') self.expert_layers = nn.ModuleList([nn.Linear(hidden_size, hidden_size) for _ in range(num_experts)]) self.gate_layer = nn.Linear(hidden_size, num_experts) self.aspect_embedding = nn.Embedding(len(aspect_embeddings), hidden_size) def forward(self, input_ids, attention_mask, aspects): bert_output = self.bert(input_ids=input_ids, attention_mask=attention_mask)[0][:, 0, :] gate_weights = nn.functional.softmax(self.gate_layer(bert_output), dim=-1) expert_outputs = [expert(bert_output + self.aspect_embedding(aspects)) for expert in self.expert_layers] output = sum(w * o for w, o in zip(gate_weights.unbind(-1), expert_outputs)) return output ``` 上述代码展示了如何构建这样一个基于BERT预训练语言模型初始化编码部分,并结合自定义的MoE结构来进行物品推荐的任务实例。其中`aspects`代表了当前会话所涉及的具体领域或者话题类别信息,这有助于增强系统的理解和响应能力。 #### 使用说明 为了有效部署这个框架,开发者需要准备如下资源: - 用户历史记录及其对应的标签/评价分数; - 文本描述或者其他辅助材料帮助理解上下文环境; - 明确划分好的方面列表,以便于指导各路专家的学习方向。 完成准备工作之后,按照常规机器学习项目流程执行即可——先对全量样本做初步探索分析,接着依据业务需求选取合适的评估指标体系开展实验验证工作直至找到最优配置方案为止。
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值