Siamese network

news2025/2/28 19:29:08

文章目录

  • 一、相似性度量
    • 1. 欧氏距离
    • 2. 马氏距离
  • 二、Siamese network
    • 1. Siamese network 基础架构
    • 2. 损失函数
    • 3. 不同的Siamese network
      • 3.1. 行人重识别
      • 3.2 其他应用场景

一、相似性度量

  相似性度量是机器学习中一个非常基础的概念,是评定两个事物之间相似程度的一种度量,尤其是在聚类、推荐算法中尤为重要。其本质就是一种量化标准,即对象间越相似,相似度越大,距离越小(度量值越小),对象间越不相似,相似度越小,距离越大(度量值越大)。
  下面介绍几种常见的相似性度量函数。

1. 欧氏距离

  欧氏距离也称欧几里得距离,是最常见的距离度量,衡量的是多维空间中两个点之间的绝对距离。计算公式如下:
在这里插入图片描述
  但是,欧氏距离在多维数据的场景下,还存在以下局限性:
  (a) 如果各分量的单位不全相同,则上述欧氏距离是不准确的。例如,第一个分量的单位是kg,第二个分量的单位是g,这意味着所计算的距离可能会根据特征的单位发生倾斜。
  (b) 即使单位相同,但如果各分量的变异性差异很大,则变异性大的分量在欧氏距离的平方和中起着决定性的作用,而变异性小的分量却几乎不起什么作用。
  一种常见的解决方案是对各分量都做标准化处理,则各分量方差同为1且均值为0,于是,平方和中各分量所起的平均作用都一样,即使单位不同,计算结果也不受其影响。

2. 马氏距离

  欧氏距离经分量的标准化之后能够消除各分量的单位或方差差异的影响,但不能消除分量之间相关性的影响。
  如下图(左上)所示,蓝点是某二维数据集分布,可以看出此数据集的x,y两个维度非独立同分布,有相关性(类似y=x)。O可以认为是数据集的中心。请问A点和B点哪个距离这个数据集更近(或者说相似度更高)?直觉上肯定是觉得B点更近,B相较于A更可能是数据集中的一个点。但若采用欧拉距离计算,AO和BO的数值是一样的,因此,显然不能用一般的距离计算公式来计算。而且标准化并不能改变数据的分布,对距离的计算并没有什么帮助。
  这种情况下,采用马氏距离,便可得出A到O的距离大于B到O的距离,下图直观的展示了马氏距离的计算过程:
在这里插入图片描述
  马氏距离公式如下,表示的是两个服从同一分布并且其协方差矩阵为Σ的随机变量X与Y的差异程度。
在这里插入图片描述
  对于变量a和b,协方差表示a和b之间的关系(协方差大于0,a和b正相关;协方差小于,a和b负相关;协方差等于0,a和b不相关)。
  而马氏距离的目的,就是计算所有分量不相关后两个变量间的差异,而令所有分量不相关的方法,便是公式中的协方差矩阵(即上上图的“旋转”过程)。

二、Siamese network

  Siamese Network(孪生网络)也称为“连体的神经网络”,是一种用于度量学习的监督模型,主要用于衡量两个输入的相似程度。

1. Siamese network 基础架构

  下图是Siamese network的基础架构,其中Input 1和Input 2是需要比较相似度的输入,它们通过两个具有相同架构、参数和权重的相似子网络(Network 1和Network 2)并输出特征编码,最终经过损失函数(Loss)的计算,得到两个输入的相似度量。
  需要注意的是,这里的两个子网络是共享权重(Weights)的,不共享权重的孪生网络又叫伪孪生网络,这里不做讨论。
在这里插入图片描述
  如下是基于TensorFlow实现的简单Siamese network模型,主要功能是识别两张28×28图片的相似度。其中Network 1和Network 2实现为简单神经网络,在真正的应用过程中,需要视情况替换为CNN模型。

# 单个神经网络,对应基础架构图中的Network 1和2
def initialize_base_network():
	input = Input(shape=(28, 28, ), name="base_input")
	x = Flatten(name="flatten_input")(input)
	x = Dense(128, activation='relu', name="first_base_dense")(x)
	x = Dropout(0.1, name="first_dropout")(x) # 防止过拟合
	x = Dense(128, activation='relu', name="second_base_dense")(x)
	x = Dropout(0.1, name="second_dropout")(x)
	x = Dense(128, activation='relu', name="third_base_dense")(x)
	return Model(inputs=input, outputs=x)

# Loss函数使用欧氏距离
def euclidean_distance(vects):
	x, y = vects
	sum_square = K.sum(K.square(x - y), axis=1, keepdims=True)
	return K.sqrt(K.maximum(sum_square, K.epsilon()))

# 输出格式
def eucl_dist_output_shape(shapes):
	shape1, shape2 = shapes
	return (shape1[0], 1)

# 构建Siamese network
base_network = initialize_base_network() # 目的是共享权重和模型,即两个输入进入同一个神经网络训练
input_1 = Input(shape=(28, 28, ), name="Network_1")
vect_output_1 = base_network(input_1) # base_network为model,此处会调用model.__call__()
input_2 = Input(shape=(28, 28, ), name="Network_2")
vect_output_2 = base_network(input_2)

output = Lambda(euclidean_distance, name="output_layer", output_shape=eucl_dist_output_shape)([vect_output_1, vect_output_2])

model = Model([input_1, input_2], output)

  模型构建结果如下,最上层为需要比较相似度的两个输入,经过完全相同且共享权重的简单神经网络,最后经过欧氏距离计算输出度量值。
在这里插入图片描述

2. 损失函数

  在训练Siamese network时,容易犯的一个错误是只输入“属于同一类的”两个图片(正样本),这样训练的模型,将无法分辨“不是同一类的”图片(负样本)。
  因此我们需要同时训练正样本和负样本,而损失函数的作用,则是要让正样本的损失尽量小,而负样本的损失尽量大,设计思路如下:
在这里插入图片描述
  几种常见的损失函数有:
在这里插入图片描述
在这里插入图片描述

3. 不同的Siamese network

3.1. 行人重识别

  行人重识别(Person Re-identification,也称行人再识别,简称为ReID),是利用计算机视觉技术判断图像或者视频序列中是否存在特定行人的技术。
  在监控视频中,由于相机分辨率和拍摄角度的缘故,通常无法得到质量非常高的人脸图片。当人脸识别失效的情况下,ReID就成为了一个非常重要的替代品技术。如下图所示,在一系列视频截图中识别出属于同一个人的图片。
在这里插入图片描述
  一个解决上述问题的Siamese network模型(2015 CVPR-An Improved Deep Learning Architecture for Person Re-Identification)如下:
在这里插入图片描述
在这里插入图片描述
  图中两个conv-maxpooling层来对图像对提取特征(论文里称为higher-order features);Cross-Input Neighborhood Differences层是用来对前层输出计算对应两个特征图的邻域差异(neightborhood difference);Patch Summary Features层对每个上层输出中的每个5x5块进行求和来得到整体的差异;Across-Patch Features层L,L′分别使用25个3x3x25、步长为1的卷积核学习neighborhood differences之间的空间关系;最后通过全连接层来捕获高层次的关系,再通过一层两个带softmax节点的全连接得到最终输出。

3.2 其他应用场景

  Siamese network的应用场景还包括:街景图和俯视图匹配、图像和文字匹配、句子和句子相似度比较等,在此不再详细介绍。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/426593.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

E: 仓库 “http://mirrors.aliyun.com/ubuntu eoan Release” 没有 Release 文件 —— 解决方案

Ubuntu 20.04 更新的时候,遇到如下问题: 可以通过修改源,来进行修复: 1、登录如下网址:LUGs repo file generator 2、选择对应的 Ubuntu 版本,这里我是 Ubuntu 20.04 点击 Download,会下载一个 …

DUBBO注册中心

注册中心上保存四种类型的数据: providers: 服务提供者目录,记录着服务提供者的ip、端口等信息。 consumers: 服务消费者目录,记录服务消费者的元数据信息,服务提供者并不会用到服务消费者的信息,这里要记录消费者的信息,是给服务治理中心(dubbo-admin)使用的。 route…

五分钟排查Linux的健康状态

五分钟排查Linux的健康状态1. CPU1.1 top命令1.2 什么是负载1.3 vmstat2. 内存2.1 观测命令2.2 CPU缓存2.3 HugePage2.4 预先加载3. I/O3.1 观测命令3.2 零拷贝4. 网络参考:《Linux运维实战》、xjjdog 操作系统作为所有程序的载体,对应用的性能影响是非常…

论文阅读 | Interpolated Convolutional Networks for 3D Point Cloud Understanding

前言:ICCV2019点云特征提取点卷积InterpoConv Interpolated Convolutional Networks for 3D Point Cloud Understanding 引言 点云是不规则、无序、且稀疏的 处理这样的点云数据有两大类方法 第一:voxel化 directly rasterize irregular point clouds…

《Netty》从零开始学netty源码(三十八)之PoolSubPage

PoolSubPage 上一节中我们提到了PooledByteBufAllocator类,先看下netty中有关内存的类关系: 从图中可以看到PoolSubPage为最小单位,所以我们先从最小的开始分析,先看下它的属性值: 为了更好的理解这些属性的意义&…

表情包MD编辑器简单使用

🌷1 表情包 ⭐️(1)常规表情图标 😀 😁 😂 😃 😄 😅 😆 😉 😊 😋 😎 😍 😘 &#x1…

(Deep Learning)交叉验证(Cross Validation)

交叉验证(Cross Validation) 交叉验证(Cross Validation)是一种评估模型泛化性能的统计学方法,它比单次划分训练集和测试集的方法更加稳定、全面。 交叉验证不但可以解决数据集中数据量不够大的问题,也可以…

CSS中flex属性的的使用以及应用场景有哪些

文章目录一. flex属性?(虚假的) --- 这里主要是回顾1.1 flex-grow1.2 flex-shrink1.3 flex-basis二. flex属性 ! (真正的!!!)三. flex一些常见的值, 以及使用场景3.1 flex:initial 使用场景3.2 flex:0 和 flex:node 适用场景3.3 flex:1 和 flex:auto3.4 总结一. flex属性?(虚…

54 openEuler搭建Mariadb数据库服务器-Mariadb介绍

文章目录54 openEuler搭建Mariadb数据库服务器-Mariadb介绍54.1 MariaDB的架构54.2 MariaDB的存储引擎54 openEuler搭建Mariadb数据库服务器-Mariadb介绍 MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可。MariaDB的目的…

零售数据分析操作篇14:利用内存计算做销售筛选分析

各位数据的朋友,大家好,我是老周道数据,和你一起,用常人思维数据分析,通过数据讲故事。 上一讲讲了图表间联动的应用场景,即当我们点击某个图表时,会影响其他图表一起变化,而变化背…

Vue3 Element-plus el-menu无限级菜单组件封装

对于element中提供给我们的el-menu组件最多可以实现三层嵌套,如果多一层数据只能自己通过变量去加一层,如果加了两层、三层这种往往是行不通的,所以只能进行封装 效果图一、定义数据 MenuData.ts export default [{id: "1",name:…

spring boot 访问HTML

HTML整合spring boot简介默认文件路径访问自定义文件路径访问或通过Controller控制器层跳转访问简介 SpringBoot默认的页面映射路径(即模板文件存放的位置)为“classpath:/templates/*.html”。静态文件路径为“classpath:/static/”,其中可…

三菱FX3U PLC计米轮功能块(完整ST代码)

计米轮功能块(wheel_FB)详细计米、测速原理请参看下面的博客: PLC高速脉冲输入计米轮模块(编码器测速/计米详细讲解)_RXXW_Dor的博客-CSDN博客线缆行业单绞机PLC控制算法详细解读可以参看下面的文章链接:线缆行业单绞机控制算法(详细图解+代码)_RXXW_Dor的博客-CSDN博客在…

大佬入局AI,职场人有新机会了?

卸任搜狗CEO一年半后,王小川宣布在AI大模型领域创业,与前搜狗COO茹立云联合成立人工智能公司百川智能,打造中国版的OpenAI,并对媒体表示:“追上ChatGPT水平,我觉得今年内可能就能够实现,但对于G…

第六天 CUDA内存管理

操作内存分配和数据复制过程概述 在gpu上开辟一块空间,并把地址记录在mem_device上在cpu上开辟一块空间,并把地址记录在mem_host上,并修改了该地址所指区域的第二个值把mem_host所指区域的数据都复制到mem_device的所指区域在cpu上开辟一块空…

面试代码——排序算法【建议收藏】

最近家里小朋友准备计算机类的研究生复试,可能会考到常见的排序算法,于是帮助整理一波,顺带复习下相关知识,考验下自己的编码能力; 关于排序算法,网上关于排序算法的帖子和代码也比较多,有的帖…

万字长文介绍R package “vegan”——入门学习与重复文献数据

vegan介绍与入门 vegan是一个用于群落生态学(community ecology)分析的包,可以进行排序、多样性和差异性分析(ordination, diversity and dissimilarity)。 vegan包含了多样性分析、排序方法和差异性分析的工具。 示…

L2-043 龙龙送外卖

L2-043 龙龙送外卖 题目描述: 给你n个点,m次询问,n个点构成一棵树 给出n个点,每个点的父节点 你现在在根结点,对于每次询问i,你都要回答,从根结点出发,至少经历1到i次询问的每个点1…

构建用户画像完整版

01 画像平台产品架构 上图是基于快看数据中台画像平台产品的理解和定位整理出来的产品架构。 画像平台首先是服务于业务的,运营可以基于画像平台对单个用户或者人群包做画像的洞察,平台服务的业务应用层包含: (1)个…

【C++初阶】(入门)命名空间

在C/C中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字…