暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

孪生网络及代码实现

云南高校数据化运营管理工程中心 2019-04-03
2147

目录






一、孪生网络

    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、孪生网络只能做二分类吗,能不能同时有多于两个的输入呢?


理解编程语言,探索数据奥秘

每日练习|干货分享|新闻资讯|公益平台。

每天学习一点点,你将会见到全新的自己。

长按识别二维码关注


文章转载自云南高校数据化运营管理工程中心,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论