孪生网络minist实现

没有原理介绍,只有代码,用 keras实现
孪生网络两个输入,一个输出。相似为1,不相似为0。

1.先创建数据集,从minist中提取

"""
代码为制作数据集,相同数字标签为1,不同数字标签为0,有了数据集才能训练
数据集为x1[i],x2[i],Y[i]。若x1[i]和x2[i]相同(数字相同)则Y[i]为1,否则Y[i]为0
"""
import numpy as np
import random
path = 'D:\DataList\mnist\mnist.npz'
f = np.load(path)
x1, y_train = f['x_train'], f['y_train']x2 = []# ---------------------制作数据集-------------------
'''
让数据集尽量平衡,
'''
Y = np.zeros([60000, 1])  # 60000,1全为0的矩阵
for i in range(60000):# 如果两个图像的标签相同,则两个图像相似度为100%,即1。如果标签不相同,则不相似,Y[i]不用改变,为0.id = random.randint(0, 60000 - 1)  # 60000-1是因为y_train[60000]不存在# 9/10是不同的,奇数为不同if i%2==1: # 索引为奇数,表示两个数字不同while y_train[i] == y_train[id]: # 当两个数字相同时(1/10概率)id = random.randint(0, 60000 - 1)if i%2==0: # 索引为偶数,表示两个数字相同while y_train[i] != y_train[id]: # 当两个数字不相同时(9/10概率)id = random.randint(0, 60000 - 1)Y[i] = 1x2.append(x1[id])# 将x2转为array(此时x2为list)
x2 = np.array(x2)# ---------------------制作数据集end-------------------np.savez('siameseData.npz', x1=x1, x2=x2,Y=Y)

2.构建孪生网络


import numpy as np
import keras
from keras.layers import *path = 'siameseData.npz'
f = np.load(path)x1, x2, Y = f["x1"], f['x2'], f['Y']
x1 = x1.astype('float32')/255.
x2 = x2.astype('float32')/255.
x1 = x1.reshape(60000,28,28,1)
print(x2.shape)
x2 = x2.reshape(60000,28,28,1)
print(Y.shape)# ---------------------查看相同数字(不同数字)个数----------------------
def sum():oneSum = 0zerosSum = 0for i in range(60000):if Y[i] == 1:oneSum = oneSum + 1else:zerosSum = zerosSum + 1print("相同的个数{}".format(oneSum))print("不同的个数{}".format(zerosSum))sum()  # 相同的个数30000,不同的个数30000# ---------------------查看相同数字(不同数字)个数----------------------# -----------------------开始孪生网络构建--------------------------------------# 特征提取,对两张图片进行特征提取
def FeatureNetwork():F_input = Input(shape=(28, 28, 1), name='FeatureNet_ImageInput')# ----------------------------------网络第一层----------------------# 28,28,1-->28,28,24models = Conv2D(filters=24, kernel_size=(3, 3), strides=1, padding='same')(F_input)models = Activation('relu')(models)# 28,28,24-->9,9,24models = MaxPooling2D(pool_size=(3, 3))(models)# ----------------------------------网络第一层----------------------# ----------------------------------网络第二层----------------------# 9,9,24-->9,9,64models = Conv2D(filters=64, kernel_size=(3, 3), strides=1, padding='same')(models)models = Activation('relu')(models)# ----------------------------------网络第二层----------------------# ----------------------------------网络第三层----------------------# 9,9,64-->7,7,96models = Conv2D(filters=96, kernel_size=(3, 3), strides=1, padding='valid')(models)models = Activation('relu')(models)# ----------------------------------网络第三层----------------------# ----------------------------------网络第四层----------------------# 7,7,96-->5,5,96models = Conv2D(filters=96, kernel_size=(3, 3), strides=1, padding='valid')(models)# ----------------------------------网络第四层----------------------# ----------------------------------网络第五层----------------------# 5,5,96-->2400models = Flatten()(models)# 2400-->512models = Dense(512)(models)models = Activation('relu')(models)# ----------------------------------网络第五层----------------------return keras.Model(F_input, models)# 共享参数
def ClassifilerNet():model = FeatureNetwork()inp1 = Input(shape=(28, 28, 1))  # 创建输入inp2 = Input(shape=(28, 28, 1))  # 创建输入2model_1 = model(inp1)  # 孪生网络中的一个特征提取分支model_2 = model(inp2)  # 孪生网络中的另一个特征提取分支merge_layers = concatenate([model_1, model_2])  # 进行融合,使用的是默认的sum,即简单的相加# ----------全连接---------fc1 = Dense(1024, activation='relu')(merge_layers)fc2 = Dense(256, activation='relu')(fc1)fc3 = Dense(1, activation='sigmoid')(fc2)# ----------构建最终网络class_models = keras.Model([inp1, inp2], fc3)  # 最终网络架构,特征层+全连接层return class_models#-----------------------孪生网络实例化以及编译训练-----------------------
siamese_model = ClassifilerNet()
siamese_model.summary()siamese_model.compile(loss='mse', # 损失函数采用mseoptimizer='rmsprop',metrics=['accuracy'])history = siamese_model.fit([x1,x2],Y,batch_size=256,epochs=2,validation_split=0.2)#-----------------------孪生网络实例化以及编译训练end-----------------------
siamese_model.save('siamese_model2.h5')
print(history.history.keys())# ----------------------查看效果-------------------------------
import matplotlib.pyplot as plt
# 准确
plt.plot(history.history['accuracy']) # 训练集准确率
plt.plot(history.history['val_accuracy']) # 验证集准确率
plt.legend()
plt.show()
# 画损失
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.legend()
plt.show()
# ----------------------查看效果end-------------------------------#---------------------后面测试(test)最后代码----------------------------#---------------------后面测试(test)最后代码end----------------------------
# -----------------------开始孪生网络构建end--------------------------------------

3.测试


import keras
import numpy as np
import matplotlib.pyplot as plt'''
frist()中的数据集是siameseData.npz中的,即没有验证集,
second()中有创建了一个数据集,当做验证集(siameseData2.npz),也就是在运行一遍3数据集制作
的代码,把里面的siameseData.npz改为siameseData2.npz便可
'''
def first():path = 'siameseData.npz'f = np.load(path)x1, x2, Y = f["x1"], f['x2'], f['Y']x = []y = []id = 0# 找10个数字相同的组成数据集,然后测试,理论输出全是1,(如有意外,纯属理论不够)for i in range(len(Y)):if id<10:if Y[i] == 1:x.append(x1[i])y.append(x2[i])id = id+1x = np.asarray(x)y = np.asarray(y)x = x.reshape(10,28,28,1)y = y.reshape(10,28,28,1)model = keras.models.load_model('siamese_model2.h5')print(model.predict([x,y]))# 可以在制作一个测试集
def second():path = 'siameseData2.npz'f = np.load(path)x1, x2, Y = f["x1"], f['x2'], f['Y']# 数据处理x1 = x1.reshape(60000,28,28,1)x2 = x2.reshape(60000,28,28,1)# 查看准确率model = keras.models.load_model('siamese_model2.h5')print(model.evaluate([x1,x2],Y))second() # 准确率大概97.49%

孪生网络keras实现minist相关推荐

  1. 独家 | 利用孪生网络,Keras,Tensorflow比较图片相似度

    作者:Adrian Rosebrock 翻译:张一然 校对:wwl 本文约3700字,建议阅读8分钟. 在本文中,您将学习如何使用孪生网络和深度学习库Keras / TensorFlow比较两个图像的 ...

  2. 单样本学习与孪生网络

    @miracle 在 单样本学习(One shot learning)和孪生网络(Siamese Network) 中说: 孪生网络与伪孪生网络 Siamese network就是"连体的神 ...

  3. MatConvnet中集成的损失函数(孪生网络的思考)

    参看网址:https://www.baidu.com/?tn=94855285_hao_pg 这篇博客主要记载了利用MatCovnet实现孪生网络的一些问题,最核心的就是两个分支如何并到一起?反向传播 ...

  4. 人机交互系统(1.2) ——深度神经网络(孪生网络)

    一.前言 深度神经网络通常比较擅长从高维数据中学习,例如图像或者语言,但这是建立在它们有大量标记的样本来训练的情况下.然而,人类却拥有单样本学习的能力--如果你找一个从来没有见过小铲刀的人,给他一张小 ...

  5. 孪生网络入门(上) Siamese Net及其损失函数

    最近在多个关键词(小数据集,无监督半监督,图像分割,SOTA模型)的范畴内,都看到了这样的一个概念,孪生网络,所以今天有空大概翻看了一下相关的经典论文和博文,之后做了一个简单的案例来强化理解.如果需要 ...

  6. 孪生网络图像相似度_生成对抗网络的进步多大,请看此文

    全文共4175字,预计学习时长8分钟 最近,多项研究采用了生成对抗网络(Generative Adversarial Networks, 简称GANs)这一技术来生成分辨率为1024x1024的高清图 ...

  7. 【深度学习】孪生网络(Siamese Network)的模式和训练过程

    [深度学习]孪生网络(Siamese Network)的模式和训练过程 文章目录 1 概述 2 Siamese network 孪生神经网络 3 孪生神经网络和伪孪生神经网络分别适用于什么场景呢? 4 ...

  8. Siamese Network (应用篇2) :孪生网络用于图像块匹配 CVPR2015

    参考论文:Zagoruyko S, Komodakis N. Learning to compare image patches via convolutional neural networks[J ...

  9. Siamese Network (应用篇1) :孪生网络特征用于图像匹配 ICPR2016

    参考论文:Siamese Network Features for Image Matching 会议水平:2016 23rd International Conference on Pattern ...

  10. SiamNet: 全卷积孪生网络用于视频跟踪

    参考论文:Fully-Convolutional Siamese Networks for Object Tracking 算法主页:http://www.robots.ox.ac.uk/~luca/ ...

最新文章

  1. canal同步mysql到kafka_使用Canal同步MySQL数据到Kafka 得到的数据中sql字段无值-问答-阿里云开发者社区-阿里云...
  2. linux 备份数据,LINUX下备份数据
  3. AI小编问世!阿里智能写手核心技术首次公开!
  4. python将非0数视为false_python 面试题
  5. Lync-用户-电话号码-更新
  6. 英文书《用unreal来学习c++》_用机器学习来概括《哈利波特》,四句话总结一场戏...
  7. php 获取字符串长度 包含空格,php中常用的字符串长度函数strlen()与mb_strlen()实例解释...
  8. memcached php封装类,PHP Memcached + APC + 文件缓存封装_PHP - key
  9. 厦门大学计算机科学与技术学院官网,罗晔-厦门大学计算机科学系
  10. 知道一点怎么设直线方程_两点直线方程怎么求
  11. CPU卡简介/CPU卡和非接触式IC卡的区别
  12. 阿里云获取手机验证码
  13. linux千兆网卡接百兆交换机,千兆交换机可以接百兆网线吗?
  14. redis为什么选择了跳跃表而不是红黑树
  15. http://free.logomaker.cn/tools/icoMaker.aspxICO图标在线制作 -- 为你的网站/软件制作图标(ICO)
  16. SwiftUI系列教程第1章第4节:Text的Padding属性
  17. C++一本通1086(角谷猜想)
  18. 里恩临床试验电子数据采集系统(EDC)介绍
  19. 5G取代光纤宽带,可能吗?
  20. CentOS 7下ngrok服务器搭建

热门文章

  1. 默纳克系统服务器怎么查故障,默纳克系统NICE3000和NICE3000new故障历史记录查询方法...
  2. RESTClient使用教程
  3. 统计·数值分析·概率论·人工智能数学基础
  4. Kernel Method: 6.再生核希尔伯特空间理论
  5. 摩尔斯电码(摩斯电码)
  6. Unity 导航网格的使用
  7. Bootstrap---dateTimePicker时间控件配置与应用
  8. DXP导出PCB为PDF格式的设置
  9. 「干货」Linux 应急响应日志分析命令「详细总结」
  10. Git版本控制管理(一)--安装