Simultaneous Feature Learning and Hash Coding with Deep Neural Networks

来源:互联网 发布:类似维棠软件 编辑:程序博客网 时间:2024/06/04 19:03

Simultaneous Feature Learning and Hash Coding with Deep Neural Networks

论文下载地址
自从2014年中山大学潘炎老师讲deep hash搬上舞台以来,关于deep hash的paper如雨后春笋般喷薄而出。本文也是潘炎老师15年参与发表的一篇paper,和之前的deep hash方法相比,本篇论文还是和先前的论文有着明显的改进。首先对于deep hash之前的方法主要是采用手工特征,这些特征最明显的缺点就是不能保证语义的相关性,即相同语义的图片应该具有比较接近的hash code。对于deep hash 方法主要是这样的思路,输入图像二元组和他们之间的label信息,从卷积层获取图像特征,从全连接层得到hash code,针对目标函数进行求导迭代。本文主要作了以下工作:

  • 网络输入为图片三元组,分别代表查询图片,与查询图片近似图片,与查询图片不近似的图片
  • 输入三元组通过共享的网络结构得到特征
  • 使用divide-and-module的模块切分图像的特征为q个branch,每一个branch对应1bit
  • 使用三元组损失函数,即查询图片与相似图片之间的距离小于查询图片与不相似图片之间的距离

    网络的整体模型如下图1所示:


    图1
    图1

Proposed Approach

Notation And Problem Definition

假定L是原始的图像空间,hash learning的目标就是学到一组hash functionF:L{0,1}q,经过hash function以后,图像I就变成了q长度的bit数组,并且保持图像之间的语义特征。网络的输入是一个三元组,包括原始图像I,和原图相近的图像I+,和原图不相近的图像I。对于这样的三元组(I,I+,I),网络的目标就是保证输出的hash codeF(I)F(I+)的距离小于F(I)F(I)的距离。作者引入了hinge loss当做网络的损失函数:

ι^triplet(F(I),F(I+),F(I))=max(0,1(||F(I)F(I)||H||F(I)F(I+)||H))s.t.F(I),F(I+),F(I){0,1}q(1)

公式(1)中||.||H代表海明距离。公式(1)中离散的定义域无法求导,所以需要进行松弛,作者提出了公式(2)的方法:
ιtriplet(F(I),F(I+),F(I))=max(0,1||F(I)F(I)||22+||F(I)F(I+)||22)s.t.F(I),F(I+),F(I)[0,1]q(2)

ι2范式来代替海明距离,并将变量{0,1}松弛为[0,1]。把公式(2)分别对F(I),F(I+),F(I)求导,为了公式描述方便,把F(I),F(I+),F(I)记为b,b+,b,导数如公式(3)所示:
ιb=(2b2b+)×I||bb+||22||bb||22+1>0ιb+=(2b+2b)×I||bb+||22||bb||22+1>0ιb=(2b2b)×I||bb+||22||bb||22+1>0(3)

shared Sub-Network

网络的主要参数如表1所示:


表1
表1

作者在别人网络结构的基础上进行修改,在原始网络的每一个convolution层后面添加了1×1的卷积层,相当于对卷积层的输出作一个线性变化。并且把传统网络的最后一层的全连接层改为ave pooling层。网络的输入是256*256的大小的图像。输入是图像三元组,三张图片共享网络的参数,得到三个维度相同图像特征三元组(x,x+,x)

Divide-and-Encode

之前的deep hash方法就是直接拿图像的feature通过一个全连接层,然后用sigmoid函数进行激活,得到q bits的hash code,如图2中b所示。但是作者提出了一种新的方法,如果需要得到q bits的hash code。网络应该输出50q长度的特征,然后将50q的特征平均划分为q个slice,每一个slice通过一个全连接层,接下来使用sigmoid激活函数限制输入在[0,1]之内,得到1bit。q个slice总共得到q比特的hash code。如图2的a所示:


这里写图片描述
图2

作者通过实验发现Divide-And-Encode方法比直接使用全连接层效果要好。究其原因,作者认为直接使用全连接层,每一位的hash code都要和所有的image feature相关,可能导致hash code之间的冗余;Divide-And-Encode的方法主要是每一位hash code只是和一个slice相关,每一个code之间的相关性比较小。
对每一个slice,总共有50维的数据,通过全连接层变为一个x(i)

fci(x(i))=Wix(xi),(4)

Wi是权重矩阵。c=fci(x(i))之后,通过如下定义的sigmoid函数保证输出在[0,1]之间:
sigmoid(c)=11+eβc(5)

β是超参数。经过sigmoid函数以后,作者又添加了piece-wise threshold函数,令s=sigmoid(c)[0,1] 。如下所示:
g(s)0,s<0.5ϵs,0.5ϵ<s<0.5+ϵ1,s>0.5+ϵ(6)

ϵ超参数。因为上述的网络只能产生实数值的hash code,网络产生的hash code还需要使用sgn函数进行量化,所以提前进行阈值处理能够减小量化时候的误差。
一幅图片得到最终的二进制hash code如图4所示:


过程
图片 4

Experiment

实验数据集有:

  • SVHN 600000 张32*32大小,总共10类。训练每类500张,100张测试。
  • CIFAR-10
  • NUS-WIDE

    这里写图片描述
    图 5 实验结果

Reference

Simultaneous Feature Learning and Hash Coding with Deep Neural Networks Hanjiang Lai ,Yan Pan, Ye Liu, Shuicheng Yan.

0 0
原创粉丝点击