Simese network

简单来说,孪生神经网络(Siamese network)就是“连体的神经网络”,神经网络的“连体”是通过共享权值来实现的

所谓权值共享就是当神经网络有两个输入的时候,这两个输入使用的神经网络的权值是共享的(可以理解为使用了同一个神经网络)。

很多时候,我们需要去评判两张图片的相似性,比如比较两张人脸的相似性,我们可以很自然的想到去提取这个图片的特征再进行比较,自然而然的,我们又可以想到利用神经网络进行特征提取。

如果使用两个神经网络分别对图片进行特征提取,提取到的特征很有可能不在一个域中,此时我们可以考虑使用一个神经网络进行特征提取再进行比较。这个时候我们就可以理解孪生神经网络为什么要进行权值共享了。

孪生神经网络有两个输入(Input1 and Input2),利用神经网络将输入映射到新的空间,形成输入在新的空间中的表示。通过Loss的计算,评价两个输入的相似度。

网络结构


上面图例使用VGG16实现图像特征提取(本博客使用VGG19,换VGG16也行),然后将两个图像的特征摊平后进行求L1距离,然后将结果放入全连接层

简单代码实现

VGG19

class VGG19(nn.Module):def __init__(self, num_classes=1000):super(VGG19, self).__init__()##加载基于VGG19的模型vgg_based = torchvision.models.vgg19(pretrained=True)for param in vgg_based.parameters():param.requires_grad = False# 修改最后一层number_features = vgg_based.classifier[6].in_features# 移除最后一层features = list(vgg_based.classifier.children())[:-1] # 添加自己的最后一层features.extend([torch.nn.Linear(number_features, num_classes)])vgg_based.classifier = torch.nn.Sequential(*features)self.features = vgg_baseddef forward(self, x):# 我们使用VGG19的features层with torch.no_grad:x = self.features(x)# 摊平x = torch.flatten(x, 1)return x

Siamese

class Siamese(nn.Module):def __init__(self, input_shape, num_classes=1000):super(Siamese, self).__init__()self.vgg = VGG19(num_classes)self.fully_connect1 = torch.nn.Linear(num_classes, 512)self.fully_connect2 = torch.nn.Linear(512, 1)def forward(self, x):x1, x2 = xx1 = self.vgg.features(x1)x2 = self.vgg.features(x2)x = torch.abs(x1 - x2)x = self.fully_connect1(x)x = self.fully_connect2(x)return x

训练

vgg19 = VGG19(num_classes=2)for i in range(10):image = torch.randn(1, 3, 224, 224)siamese = Siamese(image.shape, 2)# 这里随机拿两个张量用于测试out = siamese((image, image))print(out)out = out.squeeze(dim=-1)mse_loss = nn.CrossEntropyLoss()optimizer = torch.optim.Adam(siamese.parameters(), lr=0.001)print(out)# 实际要根据两张图片是否为同一个体输入labelsloss = mse_loss(out, torch.tensor([1], dtype=torch.float))print("loss", loss)optimizer.zero_grad()loss.backward()optimizer.step()

损失函数优化

‎‎‎对比度损失‎‎(Contrastive loss)

Triplet Loss

训练集中随机选取一个样本:Anchor(a)
再随机选取一个和Anchor属于同一类的样本:Positive(p)
再随机选取一个和Anchor属于不同类的样本:Negative(n)
这样<a, p, n>就构成了一个三元组

我们想要的是P靠近A,N远离A,用数学表达如下图

pytorch 代码实现

CLASS torch.nn.TripletMarginLoss(margin=1.0, p=2.0, eps=1e-06, swap=False, size_average=None, reduce=None, reduction='mean')


官方例子

triplet_loss = torch.nn.TripletMarginLoss(margin=1.0, p=2)
anchor = torch.randn(20, 20, requires_grad=True)
positive = torch.randn(20, 20, requires_grad=True)
negative = torch.randn(20, 20, requires_grad=True)output = triplet_loss(anchor, positive, negative)
output.backward()
  • triplet hard loss

三元损失约束条件需要在所有的三元组上面都成立,但是如果严格按照这个约束,那么三元组集合可能会相当大,需要穷举所有的三元组,显然不太现实,所以常用的办法就是选取部分进行训练,也就是选取困难样本对(hard triplets)进行训练

那么hard triplets怎么选

Hierarchical Triplet loss

通过建立层次树表示,递归合并叶子结点,直到到达根节点

首先要建立类间距离公式,如果两个类之间距离近则合并到下一层



如何选取Anchor?在层次树的第0层选取l ′ l^{\prime}l

个节点,对每个节点分别选取(m-1)个在第0层最近的类,在每个类随机选取t个图片。因此,mini-batch的数量为n =l ′mt。
Hierarchical triplet loss 的表达式为:


Ensembles

Applications in vision

  • Siamese network on MNIST

  • Establishing image correspondences




  • Establishing image correspondences

  • Image retrieval

  • 无监督学习

  • Optical flow


  • Optical flow with CNNs

  • FlowNet:architecture 1
  • FlowNet:architecture 2

  • Correlation layer




15、孪生网络与相似度相关推荐

  1. 孪生网络图像相似度_生成对抗网络的进步多大,请看此文

    全文共4175字,预计学习时长8分钟 最近,多项研究采用了生成对抗网络(Generative Adversarial Networks, 简称GANs)这一技术来生成分辨率为1024x1024的高清图 ...

  2. 孪生网络图像相似度_论文浅尝 | 使用孪生BERT网络生成句子的嵌入表示

    论文笔记整理:吴杨,浙江大学计算机学院,知识图谱.NLP方向. https://www.ctolib.com/https://arxiv.org/abs/1908.10084 动机 谷歌的 BERT ...

  3. 孪生网络图像相似度_孪生网络:使用双头神经网络进行元学习

    深度神经网络有一个大问题-他们一直渴望数据. 当数据太少时(无法到达算法可以接受的数量)深度神经网络很难推广. 这种现象突出了人类和机器认知之间的差距. 人们可以通过很少的训练示例来学习复杂的模式(尽 ...

  4. 独家 | 利用孪生网络,Keras,Tensorflow比较图片相似度

    作者:Adrian Rosebrock 翻译:张一然 校对:wwl 本文约3700字,建议阅读8分钟. 在本文中,您将学习如何使用孪生网络和深度学习库Keras / TensorFlow比较两个图像的 ...

  5. 基于孪生网络的跟踪算法汇总

    目录 1 SINT--[论文链接](https://arxiv.org/pdf/1605.05863.pdf)--[项目链接](https://taotaoorange.github.io/proje ...

  6. 【CV】SiamFC:用于目标跟踪的全卷积孪生网络

    论文名称:Fully-Convolutional Siamese Networks for Object Tracking 论文下载:https://arxiv.org/abs/1605.07648 ...

  7. 单样本学习与孪生网络

    @miracle 在 单样本学习(One shot learning)和孪生网络(Siamese Network) 中说: 孪生网络与伪孪生网络 Siamese network就是"连体的神 ...

  8. Siamese Network (应用篇2) :孪生网络用于图像块匹配 CVPR2015

    参考论文:Zagoruyko S, Komodakis N. Learning to compare image patches via convolutional neural networks[J ...

  9. Siamese Network (应用篇1) :孪生网络特征用于图像匹配 ICPR2016

    参考论文:Siamese Network Features for Image Matching 会议水平:2016 23rd International Conference on Pattern ...

  10. SiamNet: 全卷积孪生网络用于视频跟踪

    参考论文:Fully-Convolutional Siamese Networks for Object Tracking 算法主页:http://www.robots.ox.ac.uk/~luca/ ...

最新文章

  1. [WPF] UserControl vs CustomControl
  2. 用对齐原则求结构体长度
  3. 计算机二级vfp模拟考试题,计算机等级考试二级VFP模拟练习题[10]
  4. sparklines图表
  5. 二叉树的基本理论知识
  6. 虚拟ip工具_针对游戏防封换IP有用吗?
  7. LeetCode 128. 最长连续序列 golang
  8. UNIX(多线程):26---悲观锁和乐观锁
  9. ecshop 模板 php代码,ecshop不能在模板文件.dwt和.lbi中直接添加php代码的解决方法...
  10. python的gui编程pyqt5_Python-GUI编程-PyQt5
  11. 微波接力通信、卫星通信、无线移动通信
  12. SQL——连接查询、聚合函数、开窗函数、分组功能、联合查询、子查询
  13. ChinaDDoS BGP 流量牵引二层VLAN回注配置
  14. python怎么根据度分布生成网络_python度分布图
  15. 2023年深圳市绿色低碳产业扶持计划申报指南
  16. 计算机系统:系统级I/O
  17. 认识植物 - 水杉 (比较常见的濒危植物)
  18. 短距离无线通信之蓝牙模块
  19. 基于android的快递寄件平台
  20. Imagination 推出最先进的光线追踪图形处理器(GPU)

热门文章

  1. Python Django项目实例二
  2. win7旗舰版梦幻主题补丁~完美你的桌面
  3. 台达b3伺服modbus通讯_台达ASDA-AB伺服与EVIEW触摸屏MODBUS通讯
  4. (tensorflow2.1.0安装教程) 对应Anaconda3(对应python3.7)+cuda10.1+cudnn7.6.5+Pycharm 网盘 链接
  5. 毕设题目:Matlab肌电信号
  6. 怎样实现EDIUS中素材小范围精确移动
  7. deb微信安装 Ubuntu20.04
  8. latex tabular 单元格里换行
  9. Java 将Excel转为OFD
  10. html表单作业练习