keras中的权值共享

  • Functional API
  • 不共享参数的模型
  • 共享参数的模型
  • 网络结构可视化

首先声明,这里的权值共享指的不是CNN原理中的共享权值,而是如何在构建类似于Siamese Network这样的多分支网络,且分支结构相同时,如何使用keras使 分支的权重共享。

Functional API

为达到上述的目的,建议使用keras中的Functional API,当然Sequential 类型的模型也可以使用,本篇博客将主要以Functional API为例讲述。

keras的多分支权值共享功能实现,官方文档介绍

上面是官方的链接,本篇博客也是基于上述官方文档,实现的此功能。(插一句,keras虽然有中文文档,但中文文档已停更,且中文文档某些函数介绍不全,建议直接看英文官方文档)

不共享参数的模型

以MatchNet网络结构为例子,为方便显示,将卷积模块个数减为2个。首先是展示不共享参数的模型,以便观看完整的网络结构。整体的网络结构如下所示:

代码包含两部分,第一部分定义了两个函数,FeatureNetwork()生成特征提取网络,ClassiFilerNet()生成决策网络或称度量网络。网络结构的可视化在博客末尾。在ClassiFilerNet()函数中,可以看到调用了两次FeatureNetwork()函数,keras.models.Model也被使用的两次,因此生成的input1和input2是两个完全独立的模型分支,参数是不共享的。

from keras.models import Sequential
from keras.layers import merge, Conv2D, MaxPool2D, Activation, Dense, concatenate, Flatten
from keras.layers import Input
from keras.models import Model
from keras.utils import np_utils
import tensorflow as tf
import keras
from keras.datasets import mnist
import numpy as np
from keras.utils import np_utils
from keras.callbacks import EarlyStopping, ModelCheckpoint, TensorBoard, ReduceLROnPlateau
from keras.utils.vis_utils import plot_model# ---------------------函数功能区-------------------------
def FeatureNetwork():"""生成特征提取网络""""""这是根据,MNIST数据调整的网络结构,下面注释掉的部分是,原始的Matchnet网络中feature network结构"""inp = Input(shape = (28, 28, 1), name='FeatureNet_ImageInput')models = Conv2D(filters=24, kernel_size=(3, 3), strides=1, padding='same')(inp)models = Activation('relu')(models)models = MaxPool2D(pool_size=(3, 3))(models)models = Conv2D(filters=64, kernel_size=(3, 3), strides=1, padding='same')(models)# models = MaxPool2D(pool_size=(3, 3), strides=(2, 2))(models)models = Activation('relu')(models)models = Conv2D(filters=96, kernel_size=(3, 3), strides=1, padding='valid')(models)models = Activation('relu')(models)models = Conv2D(filters=96, kernel_size=(3, 3), strides=1, padding='valid')(models)models = Activation('relu')(models)models = Flatten()(models)models = Dense(512)(models)models = Activation('relu')(models)model = Model(inputs=inp, outputs=models)return modeldef ClassiFilerNet():  # add classifier Net"""生成度量网络和决策网络,其实maychnet是两个网络结构,一个是特征提取层(孪生),一个度量层+匹配层(统称为决策层)"""input1 = FeatureNetwork()                     # 孪生网络中的一个特征提取input2 = FeatureNetwork()                     # 孪生网络中的另一个特征提取for layer in input2.layers:                   # 这个for循环一定要加,否则网络重名会出错。layer.name = layer.name + str("_2")inp1 = input1.inputinp2 = input2.inputmerge_layers = concatenate([input1.output, input2.output])        # 进行融合,使用的是默认的sum,即简单的相加fc1 = Dense(1024, activation='relu')(merge_layers)fc2 = Dense(1024, activation='relu')(fc1)fc3 = Dense(2, activation='softmax')(fc2)class_models = Model(inputs=[inp1, inp2], outputs=[fc3])return class_models# ---------------------主调区-------------------------
matchnet = ClassiFilerNet()
matchnet.summary()  # 打印网络结构
plot_model(matchnet, to_file='G:/csdn攻略/picture/model.png')  # 网络结构输出成png图片

共享参数的模型

FeatureNetwork()的功能和上面的功能相同,为方便选择,在ClassiFilerNet()函数中加入了判断是否使用共享参数模型功能,令reuse=True,便使用的是共享参数的模型。
关键地方就在,只使用的一次Model,也就是说只创建了一次模型,虽然输入了两个输入,但其实使用的是同一个模型,因此权重共享的。

from keras.models import Sequential
from keras.layers import merge, Conv2D, MaxPool2D, Activation, Dense, concatenate, Flatten
from keras.layers import Input
from keras.models import Model
from keras.utils import np_utils
import tensorflow as tf
import keras
from keras.datasets import mnist
import numpy as np
from keras.utils import np_utils
from keras.callbacks import EarlyStopping, ModelCheckpoint, TensorBoard, ReduceLROnPlateau
from keras.utils.vis_utils import plot_model# ----------------函数功能区-----------------------
def FeatureNetwork():"""生成特征提取网络""""""这是根据,MNIST数据调整的网络结构,下面注释掉的部分是,原始的Matchnet网络中feature network结构"""inp = Input(shape = (28, 28, 1), name='FeatureNet_ImageInput')models = Conv2D(filters=24, kernel_size=(3, 3), strides=1, padding='same')(inp)models = Activation('relu')(models)models = MaxPool2D(pool_size=(3, 3))(models)models = Conv2D(filters=64, kernel_size=(3, 3), strides=1, padding='same')(models)# models = MaxPool2D(pool_size=(3, 3), strides=(2, 2))(models)models = Activation('relu')(models)models = Conv2D(filters=96, kernel_size=(3, 3), strides=1, padding='valid')(models)models = Activation('relu')(models)models = Conv2D(filters=96, kernel_size=(3, 3), strides=1, padding='valid')(models)models = Activation('relu')(models)# models = Conv2D(64, kernel_size=(3, 3), strides=2, padding='valid')(models)# models = Activation('relu')(models)# models = MaxPool2D(pool_size=(3, 3), strides=(2, 2))(models)models = Flatten()(models)models = Dense(512)(models)models = Activation('relu')(models)model = Model(inputs=inp, outputs=models)return modeldef ClassiFilerNet(reuse=False):  # add classifier Net"""生成度量网络和决策网络,其实maychnet是两个网络结构,一个是特征提取层(孪生),一个度量层+匹配层(统称为决策层)"""if reuse:inp = Input(shape=(28, 28, 1), name='FeatureNet_ImageInput')models = Conv2D(filters=24, kernel_size=(3, 3), strides=1, padding='same')(inp)models = Activation('relu')(models)models = MaxPool2D(pool_size=(3, 3))(models)models = Conv2D(filters=64, kernel_size=(3, 3), strides=1, padding='same')(models)# models = MaxPool2D(pool_size=(3, 3), strides=(2, 2))(models)models = Activation('relu')(models)models = Conv2D(filters=96, kernel_size=(3, 3), strides=1, padding='valid')(models)models = Activation('relu')(models)models = Conv2D(filters=96, kernel_size=(3, 3), strides=1, padding='valid')(models)models = Activation('relu')(models)# models = Conv2D(64, kernel_size=(3, 3), strides=2, padding='valid')(models)# models = Activation('relu')(models)# models = MaxPool2D(pool_size=(3, 3), strides=(2, 2))(models)models = Flatten()(models)models = Dense(512)(models)models = Activation('relu')(models)model = Model(inputs=inp, outputs=models)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,即简单的相加else:input1 = FeatureNetwork()                     # 孪生网络中的一个特征提取input2 = FeatureNetwork()                     # 孪生网络中的另一个特征提取for layer in input2.layers:                   # 这个for循环一定要加,否则网络重名会出错。layer.name = layer.name + str("_2")inp1 = input1.inputinp2 = input2.inputmerge_layers = concatenate([input1.output, input2.output])        # 进行融合,使用的是默认的sum,即简单的相加fc1 = Dense(1024, activation='relu')(merge_layers)fc2 = Dense(1024, activation='relu')(fc1)fc3 = Dense(2, activation='softmax')(fc2)class_models = Model(inputs=[inp1, inp2], outputs=[fc3])return class_models

如何看是否真的是权值共享呢?直接对比特征提取部分的网络参数个数!

不共享参数模型的参数数量:

共享参数模型的参数总量

共享参数模型中的特征提取部分的参数量为:

由于截图限制,不共享参数模型的特征提取网络参数数量不再展示。其实经过计算,特征提取网络部分的参数数量,不共享参数模型是共享参数的两倍。两个网络总参数量的差值就是,共享模型中,特征提取部分的参数的量

网络结构可视化

不共享权重的网络结构

共享参数的网络结构,其中model_1代表的就是特征提取部分。


利用keras实现孪生网络中的权值共享相关推荐

  1. 如何理解CNN中的权值共享

    记录一下深度学习中CNN中的权值共享 首先,卷积网络的核心思想是将:局部感受野.权值共享(或者权值复制)以及时间或空间亚采样这三种结构思想结合起来获得了某种程度的位移.尺度.形变不变性. 通俗理解,所 ...

  2. 神经网络中的权值共享

    2012年的AlexNet网络是深度学习的开端,但是CNN的开端最早其实可以追溯到LeNet5模型,它的几个特性在2010年初的卷积神经网络研究中被广泛的使用--其中一个就是权值共享. 神经网络的输入 ...

  3. 如何理解卷积神经网络中的权值共享

    权值共享这个词最开始其实是由LeNet5模型提出来,在1998年,LeCun发布了LeNet网络架构,就是下面这个: 虽然现在大多数的说法是2012年的AlexNet网络是深度学习的开端,但是CNN的 ...

  4. 卷积神经网络中的权值共享

    一.起源 权值共享这个词最开始其实是由LeNet5模型提出来,在1998年,LeCun发布了LeNet网络架构 其实权值共享这个词说全了就是整张图片在使用同一个卷积核内的参数,比如一个3*3*1的卷积 ...

  5. 理解卷积神经网络中的权值共享

    首先介绍单层网络实行的权重共享袁力介绍 简单从共享的角度来说:权重共享即filter的值共享 卷积神经网络两大核心思想: 1.网络局部连接(Local Connectivity) 2.卷积核参数共享( ...

  6. CNN中的卷积操作与权值共享

    CNN中非常有特点的地方就在于它的局部连接和权值共享,通过卷积操作实现局部连接,这个局部区域的大小就是滤波器filter,避免了全连接中参数过多造成无法计算的情况,再通过参数共享来缩减实际参数的数量, ...

  7. CNN中的局部连接(Sparse Connectivity)和权值共享

    局部连接与权值共享 下图是一个很经典的图示,左边是全连接,右边是局部连接. 对于一个1000 × 1000的输入图像而言,如果下一个隐藏层的神经元数目为10^6个,采用全连接则有1000 × 1000 ...

  8. java二叉树求权值_二叉树中的权值是什么?

    展开全部 二叉树中的权值就是对叶子结点赋予的一个有意义的数量值. 一棵深度为k,且有2^k-1个节点的二叉树,32313133353236313431303231363533e58685e5aeb93 ...

  9. 求在整数序列A中连续权值最大的子序列的权值

    题目描述 给定整数序列A. 求在整数序列A中连续权值最大的子序列的权值. 输入描述: 第一行输入整数n.(1<=n<=1000) 第二行输入n整数a.(-1000<=a<=10 ...

  10. 局部连接来减参,权值共享肩并肩(深度学习入门系列之十一)

    系列文章: 一入侯门"深"似海,深度学习深几许(深度学习入门系列之一) 人工"碳"索意犹尽,智能"硅"来未可知(深度学习入门系列之二) 神经 ...

最新文章

  1. python延时一秒_python如何最快毫秒速度使用requests?
  2. 博客文章的置顶功能『博客帮助』
  3. POJ2823 Sliding Window【单调队列】【线段树】【ST表】
  4. easyui datagrid 中怎么选中所有页面的数据_学会这5个Excel中常用技巧,可以准时下班去摆摊了...
  5. RTTI: dynamic_cast typeid
  6. ambari搭建注意事项
  7. 模型压缩:模型量化打怪升级之路-工具篇
  8. 海报PSD分层促销模板|深层剖析设计套路
  9. SQL Server高级查询之T-SQL编程(流程控制语句)
  10. 86五笔输入法教程详解
  11. 适合matlab的编程字体“YAHEI CONSOLAS HYBRID”-下载+安装
  12. 【阿里云服务器】ECS云服务器新手上路
  13. 各种光流算法介绍和原理
  14. 面积计算9860SD计算器程序(好用就用,不用就删-----歪XX)
  15. 苹果电脑macos Monterey 12.5(21G72)dmg原版引导版镜像下载
  16. Android 快速集成谷歌账户登录
  17. 消息中间件合集:MQ(ActiveMQ/RabbitMQ/RocketMQ)+Kafka+笔记
  18. Vue3的filter过滤器代替方法
  19. FPGA实现ADC采样芯片ADS8688的采样
  20. python3利用正则表达式爬取内涵段子

热门文章

  1. 计算机控制温度闭环控制实验,温度闭环控制实验
  2. Rhadoop的安装
  3. 软件测试简历项目经验介绍,软件测试工程师项目经验简历范文
  4. 网易云音乐 linux x32,网易云音乐 for Mac
  5. python自动轨迹绘制七边形_断面法计算土方步骤及其技巧
  6. java pdf分页显示_使用iText“重新分页”PDF
  7. html跳转浏览器打开新页面打开新窗口,用JS控制打开新窗口
  8. java saas 开源框架_(转载)适合SaaS的几种架构比较
  9. android gradle abi mips x86,APP_ABI := armeabi armeabi-v7a mips x86与= armeabi armeabi-v7a区别是?...
  10. python代码文件生成exe文件