参考文献:
神经网络学习小记录52——Pytorch搭建孪生神经网络(Siamese network)比较图片相似性_Bubbliiiing的博客-CSDN博客_神经网络图片相似性
Python - 深度学习系列2-人脸比对 Siamese_yukai08008的博客-CSDN博客
1.孪生网络
孪生神经网络(Siamese network)即“连体的神经网络”,
神经网络的“连体”是通过共享权值来实现的,如图所示。

孪生神经网络有两个输入(Input1 and Input2),利用特征提取网络将输入映射到新的空间,形成输入在新的空间中的表示。然后对得到的两个输出进行相减,得到新的输出,并进行全连接层分类,最后输出一个向量,再通过Sigmoid函数将其转化到0-1之间,该值即为两个输入的相似度。
2.孪生网络
(1)特征提取部分
本孪生网络采用vgg16的features作为特征提取网络,提取完后将两个向量展平,便于相减得到新的向量并进行全连接层分类。
代码实现:
vgg16 = models.vgg16(pretrained=True)
# 获取VGG16的特征提取层
vgg = vgg16.features
class SiameseNetwork(nn.Module):
def __init__(self, input_shape):
super(SiameseNetwork, self).__init__()
self.vgg = vgg
def forward_once(self, x):
output = self.vgg(x)
output = torch.flatten(output, 1)
def forward(self, input1, input2):
output1 = self.forward_once(input1)
output2 = self.forward_once(input2)
这里最好不要将features的权重冻结,因为这样不能很好提取我们所需图片的特征,泛化能力也不好。
(2)全连接层
将得到的两个输出(output1和output2)进行相减,得到output,并对output进行全连接层,注意:其展平长度需通过计算得出,最后通过三个全连接层得到一个输出通道,并采取Sigmoid将其范围控制在0到1之间。(由于我们使用的损失函数是BCEWithLogitsLoss,即进行损失计算前会对预测值进行Sigmoid,因此在这里我们就不加Sigmoid)
代码实现:
最低0.47元/天 解锁文章
981

被折叠的 条评论
为什么被折叠?



