目录
一、孪生网络
1、孪生网络原理
2、适用条件
3、损失函数
二、基于MNIST数据集的孪生网络
1、步骤
2、详细代码
编辑:
校对:
版本:
贝贝
贝贝
python3
一、孪生网络
1、孪生网络原理
提到“孪生”,大家可能想到孪生姐妹,一般我们认为孪生姐妹长得几乎一样,但仔细观察还是存在一定差异的。由此引出我们今天的内容——孪生网络,可用来衡量两个输入的相似程度。
孪生神经网络有两个输入,将两个输入feed进入两个神经网络,这两个神经网络分别将输入映射到新的空间,形成输入在新的空间中的表示。通过Loss的计算,评价两个输入的相似度。

如上图是孪生网络的总体结构,给定两个输入X1和X2,分别经过两个结构相同、权值绑定的双胞胎子网络,最后输出它们之间的相似性,用L表示:

给定一组映射函数,W为参数,我们的目的是寻找一组参数,当X1和X2属于同一类别时,相似性度量是一个较小的值,当X1和X2属于不同类别时,相似性度量较大。这个系统是用训练集中的成对样本进行训练的,针对成对样本输入,这里有两个相同的函数G,拥有相同的参数W。
2、适用条件
前面介绍了孪生神经网络的原理,大家思考一下孪生神经网络的适用条件或者用途。
我们知道,传统的分类方法需要知道每个样本属于哪个类,针对每个样本有确切的标签。但在类别数量特别多、标签相对较少的情况下,这时进行分类可采用孪生网络。
孪生网络可以解决的实际问题,如验证银行票据上的签名与预留签名是否一致;人脸验证;词汇的语义相似度分析等。
3、损失函数
传统的siamese network使用Contrastive Loss对比损失函数。针对输入的样本对是否来自同一个类别设计了损失函数,损失函数形式类似交叉熵损失函数:

#定义损失函数def siamese_loss(out1,out2,y,Q=5):
Q = tf.constant(Q, name="Q",dtype=tf.float32)
E_w = tf.sqrt(tf.reduce_sum(tf.square(out1-out2),1))
pos = tf.multiply(tf.multiply(1-y,2/Q),tf.square(E_w))
neg = tf.multiply(tf.multiply(y,2*Q),tf.exp(-2.77/Q*E_w))
loss = pos + neg
loss = tf.reduce_mean(loss)
return loss二、基于MNIST数据集的孪生网络
1、 步骤:
(1)导入MNIST数据集;
(2)定义孪生网络损失函数;
(3)搭建孪生网络整体框架(3个卷积层和3个全连接层);
(4)训练模型

2、 详细代码链接:
https://pan.baidu.com/s/1unqEmKS8dWbi8C4ykJGyuQ
在公众号回复“提取码”三字即可获得提取码,永久有效。
参考资料:
https://blog.csdn.net/qq1483661204/article/details/79039702
http://yann.lecun.com/exdb/publis/pdf/chopra-05.pdf
思考——学而不思则罔
1、前面提到的孪生网络用于处理两个输入"比较类似"的情况,对于两个输入"有一定差别"的情况该如何处理?
2、孪生网络只能做二分类吗,能不能同时有多于两个的输入呢?

理解编程语言,探索数据奥秘
每日练习|干货分享|新闻资讯|公益平台。
每天学习一点点,你将会见到全新的自己。

长按识别二维码关注




