15、孪生网络与相似度
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、孪生网络与相似度相关推荐
- 孪生网络图像相似度_生成对抗网络的进步多大,请看此文
全文共4175字,预计学习时长8分钟 最近,多项研究采用了生成对抗网络(Generative Adversarial Networks, 简称GANs)这一技术来生成分辨率为1024x1024的高清图 ...
- 孪生网络图像相似度_论文浅尝 | 使用孪生BERT网络生成句子的嵌入表示
论文笔记整理:吴杨,浙江大学计算机学院,知识图谱.NLP方向. https://www.ctolib.com/https://arxiv.org/abs/1908.10084 动机 谷歌的 BERT ...
- 孪生网络图像相似度_孪生网络:使用双头神经网络进行元学习
深度神经网络有一个大问题-他们一直渴望数据. 当数据太少时(无法到达算法可以接受的数量)深度神经网络很难推广. 这种现象突出了人类和机器认知之间的差距. 人们可以通过很少的训练示例来学习复杂的模式(尽 ...
- 独家 | 利用孪生网络,Keras,Tensorflow比较图片相似度
作者:Adrian Rosebrock 翻译:张一然 校对:wwl 本文约3700字,建议阅读8分钟. 在本文中,您将学习如何使用孪生网络和深度学习库Keras / TensorFlow比较两个图像的 ...
- 基于孪生网络的跟踪算法汇总
目录 1 SINT--[论文链接](https://arxiv.org/pdf/1605.05863.pdf)--[项目链接](https://taotaoorange.github.io/proje ...
- 【CV】SiamFC:用于目标跟踪的全卷积孪生网络
论文名称:Fully-Convolutional Siamese Networks for Object Tracking 论文下载:https://arxiv.org/abs/1605.07648 ...
- 单样本学习与孪生网络
@miracle 在 单样本学习(One shot learning)和孪生网络(Siamese Network) 中说: 孪生网络与伪孪生网络 Siamese network就是"连体的神 ...
- Siamese Network (应用篇2) :孪生网络用于图像块匹配 CVPR2015
参考论文:Zagoruyko S, Komodakis N. Learning to compare image patches via convolutional neural networks[J ...
- Siamese Network (应用篇1) :孪生网络特征用于图像匹配 ICPR2016
参考论文:Siamese Network Features for Image Matching 会议水平:2016 23rd International Conference on Pattern ...
- SiamNet: 全卷积孪生网络用于视频跟踪
参考论文:Fully-Convolutional Siamese Networks for Object Tracking 算法主页:http://www.robots.ox.ac.uk/~luca/ ...
最新文章
- [WPF] UserControl vs CustomControl
- 用对齐原则求结构体长度
- 计算机二级vfp模拟考试题,计算机等级考试二级VFP模拟练习题[10]
- sparklines图表
- 二叉树的基本理论知识
- 虚拟ip工具_针对游戏防封换IP有用吗?
- LeetCode 128. 最长连续序列 golang
- UNIX(多线程):26---悲观锁和乐观锁
- ecshop 模板 php代码,ecshop不能在模板文件.dwt和.lbi中直接添加php代码的解决方法...
- python的gui编程pyqt5_Python-GUI编程-PyQt5
- 微波接力通信、卫星通信、无线移动通信
- SQL——连接查询、聚合函数、开窗函数、分组功能、联合查询、子查询
- ChinaDDoS BGP 流量牵引二层VLAN回注配置
- python怎么根据度分布生成网络_python度分布图
- 2023年深圳市绿色低碳产业扶持计划申报指南
- 计算机系统:系统级I/O
- 认识植物 - 水杉 (比较常见的濒危植物)
- 短距离无线通信之蓝牙模块
- 基于android的快递寄件平台
- Imagination 推出最先进的光线追踪图形处理器(GPU)
热门文章
- Python Django项目实例二
- win7旗舰版梦幻主题补丁~完美你的桌面
- 台达b3伺服modbus通讯_台达ASDA-AB伺服与EVIEW触摸屏MODBUS通讯
- (tensorflow2.1.0安装教程) 对应Anaconda3(对应python3.7)+cuda10.1+cudnn7.6.5+Pycharm 网盘 链接
- 毕设题目:Matlab肌电信号
- 怎样实现EDIUS中素材小范围精确移动
- deb微信安装 Ubuntu20.04
- latex tabular 单元格里换行
- Java 将Excel转为OFD
- html表单作业练习