zoukankan      html  css  js  c++  java
  • 【61】Siamese网络

    上篇笔记里提到的函数d的作用:

    输入两张人脸,然后告诉它们的相似度

    实现这个功能的一个方式就是用Siamese网络

    经常看到这样的卷积网络,输入图片x(1)
    然后通过一些列卷积,池化和全连接层
    最终得到这样的特征向量(编号1)

    有时这个会被送进softmax单元来做分类,但在这里不会这么做
    关注的重点是这个向量(编号1),假如它有128个数,它是由网络深层的全连接层计算出来的
    要给这128个数命个名字,把它叫做f(x(1))
    可以把f(x(1))看作是输入图像x(1)的编码,取这个输入图像(编号2)
    在这里是大雄的图片,然后表示成128维的向量

    2. 建立人脸识别系统
    建立一个人脸识别系统的方法:

    如果要比较两个图片的话,例如这里的第一张(编号1)和第二张图片(编号2)
    要做的就是把第二张图片喂给有同样参数的同样的神经网络
    然后得到一个不同的128维的向量(编号3),这个向量代表或者编码第二个图片
    要把第二张图片的编码叫做f(x(2))
    用x(1)和x(2)仅仅代表两个输入图片
    他们没必要非是第一个和第二个训练样本,可以是任意两个图片

    最后如果相信这些编码很好地代表了这两个图片,要做的就是定义d 
    将x(1)和x(2)的距离定义为这两幅图片的编码之差的范数:

    对于两个不同的输入,运行相同的卷积神经网络,然后比较它们
    这一般叫做Siamese网络架构

    这里提到的很多观点,都来自于Yaniv Taigman,Ming Yang,Marc’ Aurelio Ranzato,Lior Wolf的论文
    他们开发的系统叫做DeepFace

    3. 训练网络
    不要忘了这两个网络有相同的参数,所以实际要做的就是训练一个网络
    它计算得到的编码可以用于函数d,它可以告诉你两张图片是否是同一个人
    更准确地说,神经网络的参数定义了一个编码函数f(x(i))

    如果给定输入图像x(i),这个网络会输出x(i)的128维的编码
    要做的就是学习参数,使得如果两个图片x(i)和x(j)是同一个人
    那么得到的两个编码的距离就小

    前面几个幻灯片我都用的是x(1)和x(2),其实训练集里任意一对x(i)和x(j)都可以
    相反,如果x(i)和x(j)是不同的人,那么会想让它们之间的编码距离大一点

    如果改变这个网络所有层的参数,会得到不同的编码结果
    要做的就是用反向传播来改变这些所有的参数,以确保满足这些条件

  • 相关阅读:
    CSS选择器
    python——前端常用的标签
    用socket发送信息在浏览器上显示出来
    Python并发编程-事件驱动模型
    python中的协程
    controller中两个方法之间共享一个变量LinkedHashMap
    分布式缓存和本地缓存
    Java基础方法
    log4j2配置日志大小,个数等
    开发一个根据xml创建代理类的小框架
  • 原文地址:https://www.cnblogs.com/lau1997/p/12384901.html
Copyright © 2011-2022 走看看