Siamese Network理解(附代码)

article/2025/9/30 22:45:27

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.


http://chatgpt.dhexx.cn/article/ITltwSr2.shtml

相关文章

详解Siamese网络

摘要 Siamese网络用途,原理,如何训练? 背景 在人脸识别中,存在所谓的one-shot问题。举例来说,就是对公司员工进行人脸识别,每个员工只给你一张照片(训练集样本少),并且…

Siamese网络(孪生网络)

1. Why Siamese 在人脸识别中,存在所谓的one-shot问题。举例来说,就是对公司员工进行人脸识别,每个员工只有一张照片(因为每个类别训练样本少),并且员工会离职、入职(每次变动都要重新训练模型…

Siamese网络(孪生神经网络)详解

SiameseFC Siamese网络(孪生神经网络)本文参考文章:Siamese背景 Siamese网络解决的问题要解决什么问题?用了什么方法解决?应用的场景: Siamese的创新Siamese的理论Siamese的损失函数——Contrastive Loss损…

8.HttpEntity,ResponseEntity

RequestBody请求体,获取一个请求的请求体内容就不用RequestParam RequestMapping("/testRequestBody")public String testRequestBody(RequestBody String body){System.out.println("请求体: "body);return "success";}只有表单才有…

使用restTemplate进行feign调用new HttpEntity<>报错解决方案

使用restTemplate进行feign调用new HttpEntity<>报错解决方案 问题背景HttpEntity<>标红解决方案心得Lyric&#xff1a; 沙漠之中怎么会有泥鳅 问题背景 今天才知道restTemplate可以直接调用feign&#xff0c;高级用法呀&#xff0c;但使用restTemplate进行feign调…

HttpClient 源码详解之HttpEntity

HttpClient 源码详解 之HttpEntity 1. 类释义 An entity that can be sent or received with an HTTP message. Entities can be found in some requests and in responses, where they are optional. There are three distinct types of entities in HttpCore, depending on …

System.Net.Http.HttpClient

本文主要是介绍如何用HttpClient请求带参数的服务&#xff0c;请求服务为某翻译API 直接上源码 1.添加using System.Net;的引用 using System.Net; 2.使用HttpClient发送请求 public static async void Fanyin_HttpClient(string fromString) {Console.WriteLine($"F…

ResponseEntity类和HttpEntity及跨平台路径问题

1. 简介 使用spring时&#xff0c;达到同一目的通常有很多方法&#xff0c;对处理http响应也是一样。本文我们学习如何通过ResponseEntity设置http相应内容、状态以及头信息。 ResponseEntity是HttpEntity的扩展&#xff0c;添加一个HttpStatus状态代码。在RestTemplate和Con…

RestTemplate发送HTTP、HTTPS请求

前面我们介绍了如何使用Apache的HttpClient发送HTTP请求,这里我们介绍Spring的Rest客户端(即:RestTemplate) 如何发送HTTP、HTTPS请求。注:HttpClient如何发送HTTPS请求,有机会的话也会再给出示例。 声明:本人一些内容摘录自其他朋友的博客&#xff0c;链接在本文末给出&#…

HttpEntity的用法

关于HttpEntity的用法 HttpEntity表示http的request和resposne实体&#xff0c;它由消息头和消息体组成。 从HttpEntity中可以获取http请求头和回应头&#xff0c;也可以获取http请求体和回应体信息。HttpEntity的使用&#xff0c;与RequestBody 、ResponseBody类似。 HttpEnti…

关于HttpEntity的用法

关于HttpEntity的用法 HttpEntity表示http的request和resposne实体&#xff0c;它由消息头和消息体组成。从HttpEntity中可以获取http请求头和回应头&#xff0c;也可以获取http请求体和回应体信息。 HttpEntity的使用&#xff0c;与RequestBody 、ResponseBody类似。HttpEntit…

查询MySQL数据库中表结构的几种方法

mySQL: 方法一、二、三&#xff1a;是在本数据库中查询。 /** 方法一 **/ show columns from activity_station; /** 方法二 **/ desc activity_station; describe activity_station;/** 方法三 **/ show create table activity_station;方法四是在统计数据库中查询。 informa…

mysql 表结构查询的SQL语句

1、查看表结构 desc student;2、查看表的DDL语句 show create table student;3、查看列的结构信息 select column_name,data_type,column_comment,column_key,extra,character_maximum_length,is_nullable,column_default from information_schema.columns where table_sch…

mysql查看表结构 desc 表名;

查看表结构 语法&#xff1a;desc 表名;

MySQL之表结构

1.添加、删除字段 查看表结构 desc blog;show columns from blog;新增字段 alter table 表名 add 字段名 字段数据类型;alter table blog add age tinyint;删除字段 alter table 表名 drop 字段名;alter table blog drop age;重新添加age alter table blog add age tinyin…

mysql查看表结构和编码

show full columns from XXXXX

查看修改MySQL表结构命令

查看修改MySQL表结构命令 简述 小编经常会遇到一些数据库编码不对得问题&#xff0c;好TM头疼&#xff0c;这里做一个记录&#xff0c;供大家参考。 修改数据库字符集&#xff1a; ALTER DATABASE db_name DEFAULT CHARACTER SET character_name [COLLATE …]; 把表默认的字…

Mysql数据库常用表结构操作语句

目录 一、准备工作二、常用表结构操作语句1.在数据库表中新增 字段、约束1.1 新增字段1.2 新增约束 2.在数据库表中修改 表、字段2.1 修改表的名字2.2 修改字段名、数据类型、默认值、注释、自增属性 3.在数据库表中删除表、字段3.1 删除表3.2删除字段、字段约束 3.在数据库表中…

mysql 查询所有表结构_mysql数据库查看表结构

Mysql技术知识点 Mysql技术知识点,首先来讲一下Mysql语句精进安装数据库,然后导入tigerfive.sql。 sql见文档结尾部分MySQL示例数据库模式由以下表组成: customers: 存储客户的数据。 products: 存储汽车的数据。 productLines: 存储产品类别数据。 orde... 文章 好程序员 2…

linux mysql 结构_linux查看mysql数据表结构

展开全部 一、简单描述表结构&#xff0c;字段类型 desc tabl_name; 显示32313133353236313431303231363533e78988e69d8331333365636133表结构&#xff0c;字段类型&#xff0c;主键&#xff0c;是否为空等属性&#xff0c;但不显示外键。 例如&#xff1a;desc table_name 二、…