标签(空格分隔):
1.论文主要内容
作者通过CNN网络来学习图片的hash code,作者在这个学习到过程当中主要的创新之处在一下几个方面。
1).不在是使用单张图片进行训练,而是通过输入一对图片来进行训练,标签是:如果这两张图片来自于同一类别,那么认为他们是相似的,为正样本,否则不同的类别的两张图片认为是负样本。
2).作者精心设计了损失函数。使得输出空间也就是hash空间,尽可能的多样化,编码更多原始图片的信息。同时限制值的。
在检索阶段:对于来的一张图片可以通过训练的网络生成hashcode,然后在图片库中进行检索,汉明距离的计算。
实验:作者在两个数据集上进行了实验:CIFAR-10,NUS_WIDE,两个数据集上得到了其他方法要好的结果。
具体的论文细节如下:
1.网络结构
2.损失函数:
其中:假设输入的两张图片是I1,I2
,得到的hashCode为b1,b2,为k维{+1,-1}向量,D(*)为Hamming distance
如果两张图片相似那么y=1
否则y=0
第一项是在y=0的时候,说明两个图片相似,那么他们两的汉明距离就是他们之间的损失,因为我们认为相似的图片的hashcode应该是非常相近的。
第二项说明在,两张图片不相似的时候,他们之间的距离,我们需要的是,不相似的图片距离尽可能的大。使得作为损失函数的一部分的第二项尽可能的小。其中m是一个阈值参数。
上面是对一对图片的损失函数,那么对于训练集我们可以得到如下的损失函数:
我们的目标就是最小化损失函数。但是对于上面的约束和其他论文的hashcode约束一样,都是二值的,离散的,不可导。所以就出现了问题,在训练的时候,不好反向传播误差。
下面就是对上面提出的损失函数进行松弛,变成可导,使得易于计算。
3.松弛
对上面的一对图片写成矩阵的表达形式,并添加正则项。得到如下的损失函数。
这里使用了l1
正则,距离使用l2距离。
同时得到整体损失函数的矩阵表达形式:
下面是在反向传播的时候需要用到的导数:
通过作者提出来的这个训练框架,最后得到的hashcode 就是对b
向量进行二值化:sign(b)
作者没有使用导非线性的一些函数:tanh,sigmoid等等,具体的好处作者接下来会陈述。
4具体的实现细节
使用Caffe来实现:具体的网络结构在上面有展示。
3层卷积和随后的三层pooling层,两层的全连接层。
使用的卷积核的个数:32,32,64 大小为55 stride=1
pooling:33 stride=2
第一个全链接层:500个神经元,第二层是k个神经元,也就是hashcode的长度。
初始化:Xavier的参数作为初始化,一篇文章里面提到的网络参数。
batch size = 200
momentum = 0.9
learning rate 0.001,没20000次迭代之后,减少40%
训练的时候,图片对是随机选择的。
训练是先选择一部分较少的输出层的然后,使用这些参数来微调到更长的hashCode
5实验部分:
5.1数据集:
CIFAR-10:60000 32*32 10个类别。512D-GIST特征,同一个类别认为是相似的,否则不相似。5w训练,1w测试。
NUS-WIDE:269648 81个标注的多类别。作者使用21个最常用的概念(类别)每个类别5000张。两张图片只要有一个类别一样,就认为相似。1w测试,其他训练。
5.2实验参数估计
正则参数的实验:
在hashcode length k = 12基础上实验
在线随机生成训练图片对和线下生成训练图片对的比较
可以看出来,在线的训练误差下降的更快。
微调和从头开始训练
作者提出来,在训练的时候,首先把hashcode 长度设置的小一点,然后获得一些参数之后,在把长度提高,用这些参数的值,进行训练。
作者进行了一些列的对比
看出来并不是从头开始训练结果比较好,相反的是进行微调效果会好。
可以看出来,微调之后的结果要好于从头开始训练的过程。
和传统的方法进行比较
结论:
作者提出了非线性的特征学习和hashcode的面向特定任务的学习过程。
对于海明空间和原始空间中的正则项和实值的约束,还有在线训练样本的生成。
实验表明作者提出的方法,优于其他已存在的方法。