该程序是介绍了一个孪生神经网络,大致就是给出两张图片,比较两张图片的相似性,比如人脸对比等

这里的数据集是mnist,代码中首先会建立一些图片对,就是pairs,如果是同类的图片,则把y值设置为 1,如果是不同类的图片,则把 y 值设置为 0;y值就是相似度

基础神经网络结构为:

_________________________________________________________________
Layer (type)                 Output Shape              Param #
=================================================================
input_1 (InputLayer)         (None, 28, 28)            0
_________________________________________________________________
flatten_1 (Flatten)          (None, 784)               0
_________________________________________________________________
dense_1 (Dense)              (None, 128)               100480
_________________________________________________________________
dropout_1 (Dropout)          (None, 128)               0
_________________________________________________________________
dense_2 (Dense)              (None, 128)               16512
_________________________________________________________________
dropout_2 (Dropout)          (None, 128)               0
_________________________________________________________________
dense_3 (Dense)              (None, 128)               16512
=================================================================
Total params: 133,504
Trainable params: 133,504
Non-trainable params: 0
_________________________________________________________________
None

就是给一个数字图片,经过一堆计算之后,会生成一个128维的向量,

然后计算两张图片的运算结果向量之间的欧氏距离,也就是函数 euclidean_distance,向量平方和再开方,其值肯定是一个整数

我们猜想一下,如果两张图片,送的数据一模一样,那么其距离结果肯定为 0,如果完全不同的两张图片,那么运算结果也应该是一个很大的数

下面是一个自定义的损失函数 contrastive_loss,损失函数的参数为 预期值 和 实际运算结果;

这里再强调一下,y_pred 的值肯定不会小于 0,因为是平方和,再开方,肯定大于等于 0

损失函数的返回值为:

    return y_true * square_pred + (1 - y_true) * margin_square

因为 y_true 是我们在数据集预处理中设置的,其值可能为 0 ,或 1,

如果 y_true 为 1,也就是两张图片预期一样时,则返回结果可以简化为 square_pred

square_pred 就是欧氏距离;

如果 y_true 为 0, 也就是两张图片预期不一样时,则返回结果可以简化为 margin_square;

    margin_square = K.square(K.maximum(margin - y_pred, 0))

损失函数就是,在结果符合预期时,损失值很小,在不符合预期时,损失值很大;

margin_square 就是 (1 - 欧氏距离)的平方,比如传了一个1,一个2,那么欧氏距离应该是很大,比如 y_pred 值为0.9,那就是符合预期,(1 - y_pred)**2,结果为 0.01,损失就很小;

而如果传了不同的两个值,一个1,一个2,结果欧式距离很小,比如 y_pred 值为 0.01,那么损失函数应该很大,这里确实很大,0.99 ** 2,差不多为 1 了,需要神经网络进行优化;

但如果传入的是两个不同的图片,计算结果 y_pred 为 10,那其实也是符合预期,反正两张不同的图片 y_pred 越大越好,那么这时候计算 K.maximum(margin - y_pred, 0) 就是 K.maximum(-9, 0),也就是 0,损失为0

其他就没有什么难点了

keras 的 example 文件 mnist_siamese.py 解析相关推荐

  1. keras 的 example 文件 cnn_seq2seq.py 解析

    该代码是实现一个翻译功能,好像是英语翻译为法语,嗯,我看不懂法语 首先这个代码有一个bug,本人提交了一个pull request来修复, https://github.com/keras-team/ ...

  2. keras 的 example 文件 cifar10_resnet.py 解析

    该代码功能是卷积神经网络进行图像识别,数据集是cifar10 同时演示了回调函数 ModelCheckpoint, LearningRateScheduler, ReduceLROnPlateau 的 ...

  3. keras 的 example 文件 babi_rnn.py 解析

    该代码的目的和 https://blog.csdn.net/zhqh100/article/details/105193991 类似 数据集也是同一个数据集,只不过这个是从 qa2_two-suppo ...

  4. keras 的 example 文件 mnist_hierarchical_rnn.py 解析

    很显然,我没有看懂 HRNN 是啥意思,没有去看论文,应该就是一种RNN结构的变形吧 网络结构如下: _________________________________________________ ...

  5. keras 的 example 文件 mnist_denoising_autoencoder.py 解析

    mnist_denoising_autoencoder.py 是一个编解码神经网络,其意义就是如果图片中有噪点的话,可以去除噪点,还原图片 其编码网络为: ______________________ ...

  6. keras 的 example 文件 mnist_cnn.py 解析

    mnist_cnn.py 基本上就是最简单的一个卷积神经网络了,其结构如下: _____________________________________________________________ ...

  7. keras 的 example 文件 imdb_bidirectional_lstm.py 解析

    imdb是一个文本情感分析的数据集,通过评论来分析观众对电影是好评还是差评 其网络结构比较简单 ____________________________________________________ ...

  8. keras 的 example 文件 lstm_text_generation.py 解析

    该程序是学习现有的文章,然后学习预测下个字符,这样一个字符一个字符的学会写文章 先打印下char_indices {'\n': 0, ' ': 1, '!': 2, '"': 3, &quo ...

  9. keras 的 example 文件 lstm_stateful.py 解析

    该程序要通过一个LSTM来实现拟合窗口平均数的功能 先看输入输出数据, print(x_train[:10]) [[[-0.08453234]][[ 0.02169589]][[ 0.07949955 ...

最新文章

  1. R语言中if else、which、%in%的用法
  2. 中北大学c语言程序设计作业答案,2016年中北大学软件学院程序设计基础考研复试题库...
  3. 把别人的Tcl/Tk代码加入到Go语言里12 游戏5 画图案?
  4. linux shutter截图,Ubuntu中安装Shutter截图工具
  5. SpringBoot整合MyBatis-Plus分页查询
  6. wxWidgets:显示 wxTreeListCtrl 的示例
  7. GDCM:gdcm::GroupDict的测试程序
  8. vs2013 无法打开 源 文件 SDKDDKVer.h
  9. eclipse2019-03设置代码编辑区背景为图片
  10. BBIAB的完整形式是什么?
  11. CMake file文件操作命令
  12. Rails中select2 实现多选框的效果
  13. Windows不同压缩软件、压缩算法、压缩率详细对比测试与选择
  14. c语言10以内随机数生成器,C语言随机数生成器
  15. Gerber 格式详解
  16. 迭代器的定义与自定义一个迭代器
  17. 根据药物名找华法林的代谢通路并可视化KGML文件
  18. Jlink在ADS下的配置说明及常见问题解决办法 (转载)
  19. RPA(Robotic Process Automation)的概要介绍
  20. 2021年茶艺师(初级)证考试及茶艺师(初级)模拟考试题库

热门文章

  1. 20172329 2017-2018-2 《程序设计与数据结构》实验五报告
  2. JavaScript对象掺杂点原型
  3. Oracle开发:normal ,sysdba,sysoper区别
  4. 函数指针amp;绑定: boost::functoin/std::function/bind
  5. [nowCoder] 局部最小值位置
  6. 6月11号=》121页-125页
  7. js判断 IE 浏览器
  8. 《OpenCV3编程入门》学习笔记6 图像处理(二)非线性滤波:中值滤波、双边滤波
  9. php 英文小写变大写,PHP英文字母大小写转换函数
  10. java 变量的线程可见性_Java多线程——变量可见性