triplet-based network介绍


本篇文章基于Learning Fine-grained Image Similarity with Deep Ranking。

目的

个性化推荐,即用户给出一个图片,系统需要给出与这张图片相似的一些图片。用分类方法去做存在的问题是分类算法认为同一类的就相似,而没有更细粒度的辨别。

方法

三元组

对于所有的图片,网络的输入为一个含有三个图片的三元组,比如 t i = ( p i , p i + , p i − ) t_i=(p_i,p_i^+,p_i^-) ti=(pi,pi+,pi),其中 p i p_i pi称为query imgage, p i + p_i^+ pi+是一个和 p i p_i pi一类的图片, p i − p_i^- pi是和 p i p_i pi不一类的图片,也就是 p i + p_i^+ pi+ p i − p_i^- pi更加和 p i p_i pi近似。见下图,从上到下依次为 p i p_i pi p i + p_i^+ pi+, p i − p_i^- pi
论文中进行实验所获得的数据是这样获得的:利用google搜索引擎进行了100000次关键字搜索,对于每次搜索选择前140个图片,并定义了各个图片之间的关系 r i , j r_{i,j} ri,j,若 i i i j j j不是同一次搜索出来的,那么 r i , j = 0 r_{i,j}=0 ri,j=0,否则利用27种特征进行线性组合来决定 r i , j r_{i,j} ri,j的大小。

这里引入一个新的问题,就是三元组如何选择的问题,论文中给出来的是方法如下:

  1. 计算每个图片的分数 r i = ∑ j : c j = c i , j ≠ i r i , j r_i=\sum_{j:c_j=c_i,j\neq i}r_{i,j} ri=j:cj=ci,j=iri,j c i c_i ci是图片的类别,即某张图片的分数等于和它同类的图片的所有关系之和。
  2. 随机选择一个图片作为query image,每个图片选择的概率为该图片的分数除以所有图片的总分数。
  3. 随机选择一个 p i + p_i^+ pi+,其中选择 p i + p_i^+ pi+的概率为:
    P ( p i + ) = m i n { T p , r i , i + } ∑ i + P ( p i + ) P(p_i^+)=\frac{min\{T_p,r_{i,i^+}\}}{\sum_{i^+}P(p_i^+)} P(pi+)=i+P(pi+)min{Tp,ri,i+}
    即希望选一个和 p i p_i pi关系更近的。
  4. 选择 p i − p_i^- pi,显然 p i − p_i^- pi有两种情况,一种是和 p i p_i pi不是一个类别的,另一种是一个类别的。要求三元组满足以下式子,否则认为这个三元组不合法。
    r i , i + − r i , i − > = T r r_{i,i^+}-r_{i,i^-}>=T_r ri,i+ri,i>=Tr
    其中 T r T_r Tr也是一个阈值。

因而如何选择三元组是这个算法所需要考虑的一个问题。

embedding

将一个图片转换成一个低维的表示,即为embedding。对于给定的输入(如 p i p_i pi),用 f ( p i ) f(p_i) f(pi)表示转换后的一维向量。该篇论文是用的神经网络做embedding。

损失函数

损失函数记为 l ( p i , p i + , p i − ) = m a x { 0 , g + D ( f ( p i ) , f ( p i + ) ) − D ( f ( p i ) , f ( p i − ) ) } l(p_i,p_i^+,p_i^-)=max\{0,g+D(f(p_i),f(p_i^+))-D(f(p_i),f(p_i^-))\} l(pi,pi+,pi)=max{0,g+D(f(pi),f(pi+))D(f(pi),f(pi))},其中D表示两个向量之间的l2范数,这个损失函数从直观来理解就是希望三种图片经过特征提取后(或embedding)后 p i p_i pi p i − p_i^- pi的差别比 p i p_i pi p i + p_i^+ pi+的差别至少大g,(g是一个超参数)。
其中pytorch中定义了这种损失函数:

class torch.nn.MarginRankingLoss(margin=0, size_average=True)
创建一个标准,给定输入 x1,x2两个1-D mini-batch Tensor's,和一个y(1-D mini-batch tensor) ,y里面的值只能是-11。

如果 y=1,代表第一个输入的值应该大于第二个输入的值,如果y=-1的话,则相反。

mini-batch中每个样本的loss的计算公式如下:

loss(x,y)=max(0,−y∗(x1−x2)+margin)
如果size_average=True,那么求出的loss将会对mini-batch求平均,反之,求出的loss会累加。默认情况下,size_average=True。

接下来给出一个样例:
triplet_loss = nn.TripletMarginLoss(margin=1.0, p=2)
input1 = autograd.Variable(torch.randn(100, 128))
input2 = autograd.Variable(torch.randn(100, 128))
input3 = autograd.Variable(torch.randn(100, 128))
output = triplet_loss(input1, input2, input3)
output.backward()

网络结构

见下图,可以看出是从所有的图片首先进行一个Triplet sampling Layer筛选三元组的工作,然后将 p i p_i pi p i − p_i^- pi p i + p_i^+ pi+分别送入网络中做embedding,将得到的结果送入ranking layer,ranking layer只是计算损失函数,然后将梯度反向传播。
在这里插入图片描述
论文中做embedding的网络采用的是下图的网络,可以看出输出是一个4096的一维向量。(论文中这个ConvNet网络是预先用ImageNet数据进行训练过的)。
在这里插入图片描述

评估

在该论文中,为了寻找有label的数据,特意又从google上进行了1000此次搜索,每次搜索选前50张,然后构造三元组,用人工的方式决定每个三元组属于的情况:

  • A和B一样接近于query image Q
  • A和B都不接近与query image Q
  • A比B接近于query image Q
  • B比A接近于query image Q

然后只保留第三种和第四种三元组,因为前两种对于排名没有任何意义。
测试数据构造好以后,有以下两种评估方式可以评估模型的好坏。

  1. 给定一个合法的三元组,要求模型经过embedding后在ranking layer D ( f ( p i ) , f ( p i + ) ) < D ( f ( p i ) , f ( p i − ) ) D(f(p_i),f(p_i^+))<D(f(p_i),f(p_i^-)) D(f(pi),f(pi+))<D(f(pi),f(pi)),即可以判断出 p i + p_i^+ pi+更接近于 p i p_i pi,并计算正确分类的比例。
  2. score-at-top-k,对于一个query image,重新获得1000张与该图片属于一个搜索关键字的图片,并将这些图片进行embedding,选出前k个与query image相似度最大的图片,然后看k个有多少个排名成功。(k一般取30)。

总结

这种网络所需要考虑的问题主要是怎样进行一个三元组的挑选,以及怎样进行一个最终结果的评估。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值