Siamese Network & Triplet NetWork-程序员宅基地

技术标签: 孪生网络  深度学习  

Siamese Network(孪生网络)

简单来说,孪生网络就是共享参数的两个神经网络

在孪生网络中,我们把一张图片 X 1 X_1 X1作为输入,得到该图片的编码 G W ( X 1 ) G_W(X_1) GW(X1)。然后,我们在不对网络参数进行任何更新的情况下,输入另一张图片 X 2 X_2 X2,并得到改图片的编码 G W ( X 2 ) G_W(X_2) GW(X2)。由于相似的图片应该具有相似的特征(编码),利用这一点,我们就可以比较并判断两张图片的相似性

孪生网络的损失函数

传统的Siamese Network使用Contrastive Loss(对比损失函数)
L = ( 1 − Y ) 1 2 ( D W ) 2 + ( Y ) 1 2 { m a x ( 0 , m − D W ) } 2 \mathcal{L} = (1-Y)\frac{1}{2}(D_W)^2+(Y)\frac{1}{2}\{max(0, m-D_W)\}^2 L=(1Y)21(DW)2+(Y)21{ max(0,mDW)}2
其中 D W D_W DW被定义为孪生网络两个输入之间的欧氏距离,即
D W = { G W ( X 1 ) − G W ( X 2 ) } 2 D_W = \sqrt{\{G_W(X_1)-G_W(X_2)\}^2} DW={ GW(X1)GW(X2)}2

  • Y Y Y值为0或1,如果 X 1 , X 2 X_1,X_2 X1,X2这对样本属于同一类,则 Y = 0 Y=0 Y=0,反之 Y = 1 Y=1 Y=1
  • m m m是边际价值(margin value),即当 Y = 1 Y=1 Y=1,如果 X 1 X_1 X1 X 2 X_2 X2之间距离大于 m m m,则不做优化(省时省力);如果 X 1 X_1 X1 X 2 X_2 X2之间的距离小于 m m m,则调整参数使其距离增大到 m m m
Contrastive Loss代码
import torch
import numpy as np
import torch.nn.functional as F

class ContrastiveLoss(torch.nn.Module):
    "Contrastive loss function"
    def __init__(self, m=2.0):
        super(ContrastiveLoss, self).__init__()
        self.m = m
            
    def forward(self, output1, output2, label):
        d_w = F.pairwise_distance(output1, output2)
        contrastive_loss = torch.mean((1-label) * 0.5 * torch.pow(d_w, 2) +
                                      (label) * 0.5 * torch.pow(torch.clamp(self.m - d_w, min=0.0), 2))

        return contrastive_loss

其中,F.pairwise_distance(x1, x2, p=2)函数公式如下
( ∑ i = 1 n ( ∣ x 1 − x 2 ∣ p ) ) 1 p x 1 , x 2 ∈ R b × n (\sum_{i=1}^n(|x_1-x_2|^p))^{\frac{1}{p}}\\ x_1,x_2 \in \mathbb{R}^{b\times n} (i=1n(x1x2p))p1x1,x2Rb×n

pairwise_distance(x1, x2, p) Computes the batchwise pairwise distance between vectors x 1 x_1 x1, x 2 x_2 x2 using the p-norm

孪生网络的用途

简单来说,孪生网络的直接用途就是衡量两个输入的差异程度(或者说相似程度)。将两个输入分别送入两个神经网络,得到其在新空间的representation,然后通过Loss Function来计算它们的差异程度(或相似程度)

  • 词汇语义相似度分析,QA中question和answer的匹配
  • 手写体识别也可以用Siamese Network
  • Kaggle上Quora的Question Pair比赛,即判断两个提问是否为同一个问题
Pseudo-Siamese Network(伪孪生网络)

对于伪孪生网络来说,两边可以是不同的神经网络(如一个是lstm,一个是cnn),并且如果是相同的神经网络,是不共享参数

孪生网络和伪孪生网络分别适用的场景
  • 孪生网络适用于处理两个输入比较类似的情况
  • 伪孪生网络适用于处理两个输入有一定差别的情况

例如,计算两个句子或者词汇的语义相似度,使用Siamese Network比较合适;验证标题与正文的描述是否一致(标题和正文长度差别很大),或者文字是否描述了一幅图片(一个是图片,一个是文字)就应该使用Pseudo-Siamese Network

Triplet Network(三胞胎网络)

如果说Siamese Network是双胞胎,那Triplet Network就是三胞胎。它的输入是三个:一个正例+两个负例,或一个负例+两个正例。训练的目标仍然是让相同类别间的距离尽可能小,不同类别间的距离尽可能大。Triplet Network在CIFAR,MNIST数据集上效果均超过了Siamese Network

损失函数定义如下:
L = m a x ( d ( a , p ) − d ( a , n ) + m a r g i n , 0 ) \mathcal{L}=max(d(a,p)-d(a,n)+margin, 0) L=max(d(a,p)d(a,n)+margin,0)

  • a a a表示anchor图像
  • p p p表示positive图像
  • n n n表示negative图像

我们希望 a a a p p p的距离应该小于 a a a n n n的距离。 m a r g i n margin margin是个超参数,它表示 d ( a , p ) d(a,p) d(a,p) d ( a , n ) d(a,n) d(a,n)之间应该相差多少,例如,假设 m a r g i n = 0.2 margin=0.2 margin=0.2,并且 d ( a , p ) = 0.5 d(a,p)=0.5 d(a,p)=0.5,那么 d ( a , n ) d(a,n) d(a,n)应该大于等于 0.7 0.7 0.7

Reference
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_37236745/article/details/109057383

智能推荐

vue父页面调用子页面方法-程序员宅基地

文章浏览阅读9.5k次,点赞3次,收藏7次。1、子页面,文件名MapContainer.vue<template> <div class="box"> <div style="position: absolute;z-index: 10;cursor:pointer" @click="animates()"></div> </div></template> <script>export default { data() { retu_vue父页面调用子页面方法

关闭或取消清空表单内容_v-if清空表单-程序员宅基地

文章浏览阅读1k次。1.v-if 布尔值控制显示隐藏,使用v-if 切换表单显示隐藏,关闭表单时v-if设置为 false,打开表单时使用v-if=“true”父组件 直接调用子组件<version-drawer v-if="showDrawer" v-model:visible="showDrawer" :data="editData" @onEmitSubmit="onEmitSubmit"/>2.watch监听在组件关闭窗口里调用props里的所有为空的属性子组件_v-if清空表单

利用Docker建立服务器和docker容器的监视系统-程序员宅基地

文章浏览阅读112次。为什么80%的码农都做不了架构师?>>> ...

Linux进程间通信——有名管道 FIFO 详解_有名管道的fifo怎么理解-程序员宅基地

文章浏览阅读788次,点赞3次,收藏2次。详细介绍了FIFO相关的关键概念、FIFO的创建、FIFO的打开规则、FIFO的读写规则,并对打开规则及读写规则进行了实例程序验证。_有名管道的fifo怎么理解

MyBatis中resultType和resultMap的区别-程序员宅基地

文章浏览阅读664次,点赞2次,收藏15次。[size=medium][align=left]MyBatis中关于resultType和resultMap的区别共同:MyBatis中在查询进行select映射的时候,返回类型为resultType、resultMap区别:1.resultType是直接表示返回类型的(对应着我们的model对象中的实体)2.resultMap则是对外部ResultMap的引用(提前定义..._mabaits resulttype实体类中5个字段

lol战绩查询接口_如何在LOL中正确的抓出内鬼-程序员宅基地

文章浏览阅读6.1k次。原本假期计划是打两个星期游戏再随便折腾点好玩的.但可惜,假期余额不断充值到账,游戏也给我打腻了.于是顺着游戏里小伙伴的撕逼开始了抓内鬼之旅,让?来看看到底是谁让我上不了王者:D.爬数据最初打算是使用wegame的查询召唤师接口,但是没找到web端且只记录半年的数据,不方便抓包(懒得用wireshark分析).然后去翻翻有没有现成的轮子,看到掌盟上已经有人做过类似的工作,还真有.https..._lol战绩接口

随便推点

Python猜数字游戏(包含异常处理,可自定义随机数产生范围、最大猜测次数,如果用户猜错的话可根据输入情况缩小猜测范围)_python猜随机数大小,根据输入的值缩小范围-程序员宅基地

文章浏览阅读1.4w次,点赞39次,收藏70次。Python猜数字游戏我在最基础的python猜数字游戏基础上增加了一些细节使得用户体验更高。具体的改进方案如下:(1)异常处理,增加程序健壮性。请用异常处理改造猜数字游戏,使其输入的不是整数(如字母、浮点数等)时,不再出错终止,而是给出“输入内容必须为整数!”的提示,并让用户重新输入。(2)增加程序灵活性 。为了方便修改生成随机数的范围,将猜数字的最小值和最大值设为变量并进行统一设置。设置猜数字的最大次数,猜错后提示还有几次机会。(3)改善用户体验。当用户没猜对时,根据猜数情况缩小猜解范围,以方便_python猜随机数大小,根据输入的值缩小范围

python实现智联e学自动刷课,智联e学自动播放_python自动播放网页视频-程序员宅基地

文章浏览阅读832次,点赞12次,收藏8次。使用python实现智联e学自动刷课,智联e学自动播放_python自动播放网页视频

数据链路层简介-程序员宅基地

文章浏览阅读7.2k次,点赞12次,收藏32次。数据链路的基本概念、主要功能_数据链路层

程序员人生:技术人员的职业发展规划_程序员个人发展目标-程序员宅基地

文章浏览阅读1.1k次。以下内容转载自https://blog.csdn.net/universsky2015/article/details/108846699技术人员的职业发展规划思考之前有一篇美团公众号的文章《工作中如何做好技术积累》。近期也在给团队同学做年度绩效沟通,在沟通的时候大家也探讨了职业发展规划。有些同学表示,希望后续能进一步在技术领域(或管理方向)进一步积累;有的同学也表示,希望在新的一年,能具有更好的技术影响力,自己能做一些技术决定,去影响其他人,这样自己会很有成就感。不过,我也挑战问了一些问题:._程序员个人发展目标

pymysql体温管理项目_spark 每天测量一次体温,数据库判断-程序员宅基地

文章浏览阅读501次。体温管理项目目标1.根据页面设计系统功能。2.设计项目数据库。3.代码实现。项目介绍登记学生每天提问信息,发现并记录异常情况!1.首页: 生成每个学生的当天体温名单,按照日期查询当天体温情况2.体温状态修改页面:实现修改某人的体温状态(1:正常,2.体温异常,3.未登记)3.异常信息登记页面:根据名字修改各种信息4.某天体温记录统计:要求:完成统计功能统计:体温正常的有多少人,异常的有多少人!扩展:统计本周/7天内/某个时间段内:某人异常体温次数。项目功_spark 每天测量一次体温,数据库判断

SpringCloud-SpringBoot读取Nacos上的配置文件_springboot读取nacos配置-程序员宅基地

文章浏览阅读2.2k次,点赞22次,收藏8次。在 Spring Boot 应用程序中,可以使用 Spring Cloud Nacos 来实现从 Nacos 服务注册中心和配置中心读取配置信息。​ 注解时,需要确保属性名与配置文件中的键名一致,Spring Boot 会自动根据前缀匹配来绑定配置项。​ 注解中的 value 值指定了要绑定的配置文件的前缀,可以直接读取到该配置文件中的相关属性值。如果想要在配置发生变化时动态刷新配置,可以在需要动态更新的 Bean 类上添加。​ 来触发配置的刷新,以便及时获取最新的配置信息。​,并添加相应的键值对。_springboot读取nacos配置