siamese_siamesefc训练 - CSDN
精华内容
参与话题
  • 文章首发于微信公众号《有三AI》 【模型解读】深度学习网络只能有一个输入吗 继续我们之前的专栏《模型解读》,今天说多输入网络,很久没写了因为实在是有更重要的事情。 平常我们所见的深度学习模型,都是输入一...

    文章首发于微信公众号《有三AI》

    【模型解读】深度学习网络只能有一个输入吗

    继续我们之前的专栏《模型解读》,今天说多输入网络,很久没写了因为实在是有更重要的事情。

    平常我们所见的深度学习模型,都是输入一个图像或者视频序列,输出分类,分割,目标检测等结果,但是还有一种模型需要输入两张,或者多张图片,这就是多输入网络结构。

    作者 | 言有三

    编辑 | 言有三

     

    01 多输入网络的应用背景

    首先我们说说在什么情况下,需要多个输入,只以纯图像应用为例。

    1.1 图像验证与匹对

    早在上个世纪90年代的时候,LeCun等研究人员就开始利用神经网络陆续进行一些研究,比如我们熟知的大名鼎鼎的LeNet5,但这绝不是唯一,今天我们来说他们的另一种网络结构,Siamese Network,网络细节我们后面这些,这里先说应用背景。

    签名验证:

    无独有偶,还是从手写字开始,同样是用于银行,用于验证签名是否一致。两个网络都是同样规格的图像输入,最后输出一个相似度。

    看到这里,你应该能够想起来如今它的更加广泛的应用,没错,就是人脸验证,或者说人脸识别了。

    其实用的时候都不需要两个输入,因为可以建立一个离线数据集专门用于检索匹配。

    而且,你可以在此基础上拓展出非常多的玩法,什么夫妻脸之类的。

    1.2 目标跟踪

    目标跟踪是一个什么过程?就是在时序帧中搜索目标的过程,本质上就是检索。

    不管是传统的目标跟踪中的生成模型和判别模型,还是用深度学习来做目标跟踪,本质上都是来求取目标区域与搜索区域的相似度,这就是典型的多输入。

    用深度学习来做,就是一个小图像和一个大图像分别输入网络,输出相似度。

    1.3 排序

    还有一类问题,可以用多输入网络来做,那就是排序。有的时候,我们很难估计一个人的实际年龄或者颜值,但是估计相对年龄和颜值就简单多了。

    而且,在此之上,做些什么谁更可爱,谁更成熟之类的,可以想出无数花样,解释的通就行了。

     

    02 多输入网络

    在这里,给大家介绍两个常见的网络,一个是siamese网络,一个是triplet网络。

    2.1 siamese network                        

    Siamese本意是“暹罗”人或“泰国”人,后在英语中指“孪生”、“连体”,这是一个外来词,来源于十九世纪泰国出生的一对连体婴儿,具体的故事我们就不说了,挺有看头,大家可以自己去了解。

    顾名思义,有两个输入,两个网络,根据这两个网络是否共享权重,可以分为真孪生网络siamese network和伪孪生网络pseudo-siamese network

    真孪生网络siamese network的结构示意图如下:

    伪孪生网络pseudo-siamese network的结构示意图如下:

    可以看出差别就在于是否共享权重,loss的选择就多了,相似度计算方法就多少,它的计算方法就有多少,交叉熵,欧式距离,余弦距离等都很常用。

    那么是否需要共享权重呢?这就看研究的问题而定了,很明显不共享权重有更大的发挥空间,这个问题本文不展开讲。

    2.2 triplet network

    如果将上面的二输入拓展为三输入怎么样?做人脸识别的同学想必不陌生。

    没错,就是triplet network。

    大家都知道,训练人脸识别网络的时候需要输入图像对来判断是不是同一个人,loss是两个样本之间的相似度。不过,光是相似度是不够的。

    我们以前有一篇文章,专门讲述了人脸识别中的softmax损失的变种,可以回顾。

    【技术综述】一文道尽softmax loss及其变种

    大家在研究的是同一个问题,如果想得到更优良的性能,不仅要将正负样本区分开,还要让类内更加紧凑(方差小),类间更加疏远(方差大)

    triplet network将输入改成三个,训练的时候使用一个正例+两个负例,或者一个负例+两个正例。

    训练的目标就是上面的:同类别间的距离尽可能的小,不同类别间的距离尽可能的大。

    基准样本x和负样本x-之间的距离定义如下:

    基准样本x和正样本x+之间的距离定义如下:

    然后优化目标就等于:

    我们假如网络训练的特别好,令margin=1,此时

    那么上面的距离:

    损失也就趋向于0,当然这种要求是不可能达到的,也不合理,因为有的正样本的确不那么相似,有的负样本的确很相似,强行学习过拟合风险就增加了

    所以实际用的时候,这个margin应该取一个合理的值,而且样本的选择也很有技巧,所以triplet network没有看起来那么好训练。Anyway,这还是很优雅的思想的。

    今天就这么多,更多的并行的输入也是有的,就作为大家的延伸阅读吧。

     

    总结

    好像文章越写越简单了,不过这是好事。

    咱们这个系列未完待续,尽情期待,不要忘了领取我们的卡片噢。

     

    深度学习模型

     

    转载文章请后台联系

    侵权必究

    本系列的完整目录:

    【模型解读】从LeNet到VGG,看卷积+池化串联的网络结构

    【模型解读】network in network中的1*1卷积,你懂了吗

    【模型解读】GoogLeNet中的inception结构,你看懂了吗

    【模型解读】说说移动端基准模型MobileNets

    【模型解读】pooling去哪儿了?

    【模型解读】resnet中的残差连接,你确定真的看懂了?

    【模型解读】“不正经”的卷积神经网络

    【模型解读】“全连接”的卷积网络,有什么好?

    【模型解读】从“局部连接”回到“全连接”的神经网络

    【模型解读】深度学习网络只能有一个输入吗

    【模型解读】从2D卷积到3D卷积,都有什么不一样

    【模型解读】浅析RNN到LSTM

    感谢各位看官的耐心阅读,不足之处希望多多指教。后续内容将会不定期奉上,欢迎大家关注有三公众号 有三AI

     

    展开全文
  • 孪生神经网络(Siamese Network)详解

    千次阅读 2019-10-27 12:34:49
    1. 要解决什么问题? 主要解决以下两类分类问题: 第一类,分类数量较少,每一类的数据量较多,比如ImageNet、VOC等。这种分类问题可以使用神经网络或者SVM解决,只要事先知道了所有的类。 第二类,分类数量较多...

    1. 要解决什么问题?

    主要解决以下两类分类问题:

    • 第一类,分类数量较少,每一类的数据量较多,比如ImageNet、VOC等。这种分类问题可以使用神经网络或者SVM解决,只要事先知道了所有的类。
    • 第二类,分类数量较多(或者说无法确认具体数量),每一类的数据量较少,比如人脸识别、人脸验证任务。

    2. 文章创新点

    解决以上两个问题,本文提出了以下解决方法:

    1. 提出了一种思路:将输入映射为一个特征向量,使用两个向量之间的“距离”(L1 Norm)来表示输入之间的差异(图像语义上的差距)。

    2. 基于上述思路设计了Siamese Network。每次需要输入两个样本作为一个样本对计算损失函数。
      1)用的softmax只需要输入一个样本。
      2)FaceNet中的Triplet Loss需要输入三个样本。

    3. 提出了Contrastive Loss用于训练。

    3. 网络结构

    在这里插入图片描述
    Siamese Network有两个结构相同,且共享权值的子网络。分别接收两个输入X1X1与X2X2,将其转换为向量Gw(X1)与Gw(X2),再通过某种距离度量的方式计算两个输出向量的距离Ew。

    4. Contrastive Loss损失函数

    在孪生神经网络(siamese network)中,其采用的损失函数是contrastive loss,这种损失函数可以有效的处理孪生神经网络中的paired data的关系。contrastive loss的表达式如下:
    $$
    其中
    在这里插入图片描述

    代表两个样本特征X1X_1X2X_2 的欧氏距离(二范数)P 表示样本的特征维数,Y 为两个样本是否匹配的标签,Y=1 代表两个样本相似或者匹配,Y=0 则代表不匹配,m 为设定的阈值,N 为样本个数。

    观察上述的contrastive loss的表达式可以发现,这种损失函数可以很好的表达成对样本的匹配程度,也能够很好用于训练提取特征的模型。

    • 当 Y=1(即样本相似时),损失函数只剩下
      在这里插入图片描述
      即当样本不相似时,其特征空间的欧式距离反而小的话,损失值会变大,这也正好符号我们的要求。
    • 当 Y=0 (即样本不相似时),损失函数为
      在这里插入图片描述
      即当样本不相似时,其特征空间的欧式距离反而小的话,损失值会变大,这也正好符号我们的要求。

    [注意这里设置了一个阈值margin,表示我们只考虑不相似特征欧式距离在0~margin之间的,当距离超过margin的,则把其loss看做为0(即不相似的特征离的很远,其loss应该是很低的;而对于相似的特征反而离的很远,我们就需要增加其loss,从而不断更新成对样本的匹配程度)]

    5. 最后

    展开全文
  • Siamese Network理解(附代码)

    万次阅读 多人点赞 2019-05-11 16:42:24
    本文主要通过论文来讲解下siamese network。 提起siamese network一般都会引用这两篇文章: 《Learning a similarity metric discriminatively, with application to face verification》和《 Hamming Distance ...

    author:DivinerShi

    文章地址:http://blog.csdn.net/sxf1061926959/article/details/54836696

    提起siamese network一般都会引用这两篇文章:
    《Learning a similarity metric discriminatively, with application to face verification》和《 Hamming Distance Metric Learning》。

    本文主要通过论文《Learning a Similarity Metric Discriminatively, with Application to Face Verification》来理解siamese网络。

    介绍

    Siamese网络是一种相似性度量方法,当类别数多,但每个类别的样本数量少的情况下可用于类别的识别、分类等。传统的用于区分的分类方法是需要确切的知道每个样本属于哪个类,需要针对每个样本有确切的标签。而且相对来说标签的数量是不会太多的。当类别数量过多,每个类别的样本数量又相对较少的情况下,这些方法就不那么适用了。其实也很好理解,对于整个数据集来说,我们的数据量是有的,但是对于每个类别来说,可以只有几个样本,那么用分类算法去做的话,由于每个类别的样本太少,我们根本训练不出什么好的结果,所以只能去找个新的方法来对这种数据集进行训练,从而提出了siamese网络。siamese网络从数据中去学习一个相似性度量,用这个学习出来的度量去比较和匹配新的未知类别的样本。这个方法能被应用于那些类别数多或者整个训练样本无法用于之前方法训练的分类问题。

    主要思想

    主要思想是通过一个函数将输入映射到目标空间,在目标空间使用简单的距离(欧式距离等)进行对比相似度。在训练阶段去最小化来自相同类别的一对样本的损失函数值,最大化来自不同类别的一堆样本的损失函数值。给定一组映射函数这里写图片描述,其中参数为W,我们的目的就是去找一组参数W。使得当这里写图片描述这里写图片描述属于同一个类别的时候,相似性度量这里写图片描述是一个较小的值,当这里写图片描述这里写图片描述属于不同的类别的时候,相似性度量这里写图片描述较大。这个系统是用训练集中的成对样本进行训练。当这里写图片描述这里写图片描述来自相同类别的时候,最小化损失函数这里写图片描述,当这里写图片描述这里写图片描述来自不同类别的时候,最大化这里写图片描述。这里的这里写图片描述除了需要可微外不需要任何的前提假设,因为针对成对样本输入,这里两个相同的函数G,拥有一份相同的参数W,即这个结构是对称的,我们将它叫做siamese architecture。
    在这篇论文中,作者用这个网络去做面部识别,比较两幅图片是不是同一个人,而且这个网络的一个优势是可以去区分那些新的没有经过训练的类别的样本。

    Siamese也算是降维方法的一种。常见的降维方法有PCA、LDA、Kernel-PCA、MDS、LLE、LB、ISOmap、FA等不做具体介绍。

    网络结构

    这里写图片描述
    上图是论文中的网络结构图,左右两边两个网络是完全相同的网络结构,它们共享相同的权值W,输入数据为一对图片(X1,X2,Y),其中Y=0表示X1和X2属于同一个人的脸,Y=1则表示不为同一个人。即相同对为(X1,X2,0),欺骗对为(X1,X2’,1)针对两个不同的输入X1和X2,分别输出低维空间结果为这里写图片描述这里写图片描述,它们是由这里写图片描述这里写图片描述经过网络映射得到的。然后将得到的这两个输出结果使用能量函数这里写图片描述进行比较。
    这里写图片描述
    损失函数定义

    我们假设损失函数只和输入和参数有关,那么我们损失函数的形式为:
    这里写图片描述
    其中这里写图片描述是第i个样本,是由一对图片和一个标签组成的,其中LG是只计算相同类别对图片的损失函数,LI是只计算不相同类别对图片的损失函数。P是训练的样本数。通过这样分开设计,可以达到当我们要最小化损失函数的时候,可以减少相同类别对的能量,增加不相同对的能量。很简单直观的方法是实现这个的话,我们只要将LG设计成单调增加,让LI单调递减就可以了,但是我们要保证一个前提就是,不相同的图片对(image pairs)距离肯定要比相同图片对的距离大,那么就是要满足:
    这里写图片描述
    所以论文中用了一个
    这里写图片描述
    作为总的损失函数,可以满足这个condition1。论文中进行了各种假设的证明已经单调性的证明,这里不再重复。
    最后给出一个精确的对单个样本的损失函数:
    这里写图片描述
    其中
    这里写图片描述
    ,Q是一个常量。
    这里写图片描述
    上图说明了收敛性。
    总结思想

    其实讲了这么多,主要思想就是三点:
    1、输入不再是单个样本,而是一对样本,不再给单个的样本确切的标签,而且给定一对样本是否来自同一个类的标签,是就是0,不是就是1
    2、设计了两个一模一样的网络,网络共享权值W,对输出进行了距离度量,可以说l1、l2等。
    3、针对输入的样本对是否来自同一个类别设计了损失函数,损失函数形式有点类似交叉熵损失:
    这里写图片描述
    最后使用获得的损失函数,使用梯度反传去更新两个网络共享的权值W。

    优点

    这个网络主要的优点是淡化了标签,使得网络具有很好的扩展性,可以对那些没有训练过的类别进行分类,这点是优于很多算法的。而且这个算法对一些小数据量的数据集也适用,变相的增加了整个数据集的大小,使得数据量相对较小的数据集也能用深度网络训练出不错的效果。

    实验设计

    实验的时候要注意,输入数据最好打乱,由于这样去设计数据集后,相同类的样本对肯定比不相同的样本对数量少,在进行训练的时候最后将两者的数据量设置成相同数量。

    总结

    本文解释的只是最早提出的siamese网络结构,提出的是一种网络结构思想,具体的使用的网络形式完全可以自己定义。包括损失函数,相似度距离的定义等。比如将损失函数的这里写图片描述用hige loss代替等。
    《Hamming Distance Metric Learning》这篇论文对siamese进一步改进,提出了一个triple net,主要贡献是将成对样本改成了三个样本,输入由(X1,X2,Y)变成了(X1,X2,X1’),表示X1和X1’是相同类别的样本,X1和x2是不同样本的类别。
    《Learning to Compare Image Patches via Convolutional Neural Networks》这篇论文写得也很好,将两个网络进行合并,输入的成对标签直接同时输入同一个网络。
    代码

    使用tensorflow在mnist上实现的siamese net

    参考文献2的官方code

    参考文献

    [1] S. Chopra, R. Hadsell, and Y. LeCun. Learning a similarity metric discriminatively, with application to face verification. In Computer Vision and Pattern Recognition, 2005. CVPR 2005. IEEE Computer Society Conference on, volume 1, pages 539–546. IEEE, 2005.
    [2] Mohammad Norouzi, David J. Fleet, Ruslan Salakhutdinov, Hamming Distance Metric Learning, Neural Information Processing Systems (NIPS), 2012.

    展开全文
  • Siamese Network:孪生网络 简单理解

    千次阅读 2019-05-28 17:40:29
    Siamese 意为暹罗猫 孪生 双子 也恰好描述了这个网络的结构 1孪生 是指这个网络结构中的Network_1和Network_2 这两个网络的结构一般是相同的,并且参数是共享的 即参数是一致的。 还有一种网络叫伪孪生网络 直观...

    Siamese 意为 暹罗猫 孪生 双子

    也恰好描述了这个网络的结构

    1孪生 是指这个网络结构中的Network_1和Network_2 

    这两个网络的结构一般是相同的,并且参数是共享的 即参数是一致的。

    还有一种网络叫伪孪生网络 直观理解就是左右两边的网络结构是不同的。

    2在图中的网络中 左右两个网络的作用是用于提取输入图片的特征。特征提取器

    比如在人脸领域,输入两个人的人脸图片信息,两个网络分别提取这两个人脸图片中不同部分。

     

    3 我们通过使用两个网络 提取出来了两个图片的特征 接下来我们计算特征之间的差距distance。

    之后返回网络的输出结果 :这两张图片是否属于同一个人。

    4关于这个网络结构的损失函数 也可理解为 计算distance的地方

    我们设定:

    Gw(PT) = Gw(X1,X2) 指两个特征上属于同一个人的误差

    Gw(PF) = Gw(X1,X2) 指两个特征上不属于同一个人的误差

    损失函数

    Loss = Gw(PT) -  Gw(PF) + α

    我们要使损失函数最小

    相当于使Gw(PT) 尽可能的小  可以理解为 这个网络 识别两张图片属于 一个人 能力 尽可能的厉害/准确

    相当于使Gw(PF)尽可能的大(因为有负号) 可以理解为 这个网络 区分/判别两张图片不属于 一个人 能力 尽可能的厉害/准确

    其中 参数 α 是为了避免损失函数的值为0 而设定的

    因为在损失函数为0 的时候 优化过程中 求导求梯度会出现问题


     接下来要说的是在网络上了解到项目中的可行步骤

    1我们在公开的数据集上训练我们的这个网络,使其有较好的特征提取能力

    2假如项目中要对一个公司的人进行人脸识别。我们可以使用训练好的网络对公司的每一个员工人脸信息使用网络进行特征提取。并保存起来。

    3当进行人脸识别的时候,我们使用网络对需判别的人脸进行特征提取,把提取出来的特征和我们库中保存的特征进行比对。

    并输出结果

    展开全文
  • Siamese 详解

    千次阅读 2018-11-15 11:16:45
    本博客引用: ...摘要 Siamese网络用途,原理,如何训练? 背景 在人脸识别中,存在所谓的one-shot问题。举例来说,就是对公司员工进行人脸识别,每个员工只给你一张照...
  • keras的siamese(孪生网络)实现

    千次阅读 2018-11-13 09:48:41
    代码位于keras的官方样例,并做了微量修改和大量学习
  • 【深度学习】Siamese Network

    千次阅读 2018-11-16 16:36:34
    基于2-channel network的图片相似度判别 ... 一、相关理论  本篇博文主要讲解2015年CVPR的一篇关于图像相似度计算的文章:《Learning to Compare Image Patches via Convolutional Neural Netwo...
  • 详解Siamese网络

    万次阅读 多人点赞 2018-11-14 19:23:11
    Siamese网络用途,原理,如何训练? 背景 在人脸识别中,存在所谓的one-shot问题。举例来说,就是对公司员工进行人脸识别,每个员工只给你一张照片(训练集样本少),并且员工会离职、入职(每次变动都要重新训练...
  • siamese(孪生) 网络

    万次阅读 2017-11-05 15:36:03
    siamese 网络, 是05年Yann Lecun提出来的。它的特点是它接收两个图片作为输入,而不是一张图片作为输入。 文献资料: 摘抄自caffe github的issue697 Siamese nets are supervised models for metric learning ...
  • 介绍Siamese代码里用到的一些函数 pytorch Dataset 里面的ImageFolder ImageFolder(root,transform=None,target_transform=None,loader=default_loader) root : 在指定的root路径下面寻找图片 transform: 对...
  • 利用cnn构建的siamese network,loss一直为0.5 利用全连接层构建的siamese network,训练集acc为0.98,测试集只有0.4 有大佬知道怎么回事吗?
  • caffe训练siamese network

    千次阅读 热门讨论 2016-01-18 23:23:49
    最近要用caffe训练siamese network,但是对c++并不熟,所有用了某博主的代码,和自己的图片数据,来训练siamese网络.caffe中的siamese network用于train Mnist dataset,步骤如下:1.准备数据 将图片分为train.txt, ...
  • 训练一个Siamese网络

    千次阅读 2017-05-26 22:04:02
    关于Siamese网络  Siamese网络最早是94年NIPS的文章《Signature Verification using a" Siamese" Time Delay Neural Network》提出用来做签名验证的一个网络,大家不要被名字唬到,其本质就是一个多分支参数共享的...
  • Siamese-RPN目标跟踪算法的实现

    千次阅读 2018-08-27 17:35:11
    关于Siamese-RPN目标跟踪算法的实现,参见我的github: https://github.com/zkisthebest/Siamese-RPN
  • 用于文本相似的Siamese Network

    万次阅读 热门讨论 2017-07-04 19:33:33
    Siamese Network简介Siamese Network 是一种神经网络的框架,而不是具体的某种网络,就像seq2seq一样,具体实现上可以使用RNN也可以使用CNN。简单的说,Siamese Network用于评估两个输入样本的相似度。网络的框架如...
  • 孪生网络Siamese Network发展历程

    千次阅读 2018-09-03 21:37:48
    孪生网络最早是出现在1993年的论文《Signature Verification using a ‘Siamese’ Time Delay Neural Network》用于美国支票上的签名验证,即验证支票上的签名与银行预留签名是否一致。 孪生网络是一种监督学习,...
  • SiameseLSTM论文阅读及其Tensorflow实现

    万次阅读 热门讨论 2017-05-24 13:58:57
    原文作者主要为针对短语/句子/序列的相似性比较提出了一种评价模型——Siamese LSTM(孪生网络)。该模型是输入为句子对,输出为输入句子对的相似性得分(得分为1-5)。该模型在SemEval 2014数据集上取得了state-of-...
  • 今年CVPR2018 tracking的文章Siamese类方法很火,之前介绍了一篇FlowTrack 今天更新一篇CVPR2018的Spotlight 原文链接:High Performance Visual Tracking with Siamese Region Proposal Network Motivation &...
  • 项目网页 http://www.robots.ox.ac.uk/~luca/siamese-fc.html 开源代码: https://github.com/bertinetto/siamese-fc...该 Siamese 网络使用的训练数据是 ILSVRC15 数据库中用于目标检测的视频。针对任意目标跟踪问
  • keras中siamese的实现

    千次阅读 2018-07-17 16:43:52
    近期由于项目需要学习了一下Siamese网络,并用keras简单实现,现总结两种写法如下: 1.keras 序贯模型 input_shape = (105, 105, 1) left_input = Input(input_shape) right_input = Input(input_shape) #build ...
1 2 3 4 5 ... 20
收藏数 3,956
精华内容 1,582
关键字:

siamese