浅谈keras中的Merge层(实现层的相加、相减、相乘实例)


Posted in Python onMay 23, 2020

【题目】keras中的Merge层(实现层的相加、相减、相乘)

详情请参考:

Merge层

一、层相加

keras.layers.Add()

添加输入列表的图层。

该层接收一个相同shape列表张量,并返回它们的和,shape不变。

Example

import keras
 
input1 = keras.layers.Input(shape=(16,))
x1 = keras.layers.Dense(8, activation='relu')(input1)
input2 = keras.layers.Input(shape=(32,))
x2 = keras.layers.Dense(8, activation='relu')(input2)
added = keras.layers.Add()([x1, x2]) # equivalent to added = keras.layers.add([x1, x2])
 
out = keras.layers.Dense(4)(added)
model = keras.models.Model(inputs=[input1, input2], outputs=out)

二、层相减

SubStract

keras.layers.Subtract()

两个输入的层相减。

它将大小至少为2,相同Shape的列表张量作为输入,并返回一个张量(输入[0] - 输入[1]),也是相同的Shape。

Example

import keras
 
input1 = keras.layers.Input(shape=(16,))
x1 = keras.layers.Dense(8, activation='relu')(input1)
input2 = keras.layers.Input(shape=(32,))
x2 = keras.layers.Dense(8, activation='relu')(input2)
# Equivalent to subtracted = keras.layers.subtract([x1, x2])
subtracted = keras.layers.Subtract()([x1, x2])
 
out = keras.layers.Dense(4)(subtracted)
model = keras.models.Model(inputs=[input1, input2], outputs=out)

三、层相乘

Multiply

keras.layers.Multiply()

该层接收一个列表的同shape张量,并返回它们的逐元素积的张量,shape不变。

注意:keras.layers.add(inputs)、keras.layers.subtract(inputs)、keras.layers.multiply(inputs)分别是对应的层包装,一般只用层包装。

补充知识:Keras天坑:想当然的对层的直接运算带来的问题

天坑

keras如何操作某一层的值(如让某一层的值取反加1等)?keras如何将某一层的神经元拆分以便进一步操作(如取输入的向量的第一个元素乘别的层)?keras如何重用某一层的值(如输入层和输出层乘积作为最终输出)?

这些问题都指向同一个答案,即使用Lambda层。

另外,如果想要更加灵活地操作层的话,推荐使用函数式模型写法,而不是序列式。

Keras当中,任何的操作都是以网络层为单位,操作的实现都是新添一层,不管是加减一个常数还是做乘法,或者是对两层的简单拼接。

所以,将一层单独劈一半出来,是一件难事。强调,Keras的最小操作单位是Layer,每次操作的是整个batch。

自然,在keras中,每个层都是对象,可以通过dir(Layer对象)来查看具有哪些属性。

然而,Backend中Tensorflow的最小操作单位是Tensor,而你搞不清楚到底是Layer和Tensor时,盲目而想当然地进行层的操作,就会出问题。到底是什么?通过type和shape是看不出来的。

如果你只是想对流经该层的数据做个变换,而这个变换本身没有什么需要学习的参数,那么直接用Lambda Layer是最合适的了。

也就是说,对每一层的加减乘除都得用keras的函数,你不能简单使用形如 ‘new_layer' =1−= 1-=1−'layer'这样的表达方式来对层进行操作。

当遇到如下报错信息:

AttributeError: 'NoneType' object has no attribute '_inbound_nodes'

TypeError: 'Tensor' object is not callable

等等

这是就要考虑一下将程序中层的操作改成Lambda的方式表达。

使用Lambda编写自己的层

Lamda层怎么用?官方文档给了这样一个例子。

# add a x -> x^2 layer
model.add(Lambda(lambda x: x ** 2))

# add a layer that returns the concatenation
# of the positive part of the input and
# the opposite of the negative part

def antirectifier(x):
  x -= K.mean(x, axis=1, keepdims=True)
  x = K.l2_normalize(x, axis=1)
  pos = K.relu(x)
  neg = K.relu(-x)
  return K.concatenate([pos, neg], axis=1)

def antirectifier_output_shape(input_shape):
  shape = list(input_shape)
  assert len(shape) == 2 # only valid for 2D tensors
  shape[-1] *= 2
  return tuple(shape)

model.add(Lambda(antirectifier,
     output_shape=antirectifier_output_shape))

乍一看,有点懵逼,什么乱七八糟的。事实上,很简单,假设L0和L1是两层,你只要将你形如下面这样的表达:

L1 = F(L0);

改成

L1 = Lambda( lambda L0:F(L0) ) (L0)

即可。为了看得清楚,多加了几个空格。

事实上,无非就是将原来的变换,通过Lambda(lambda 输入:表达式)这样的方式,改成了Lambda型函数,再把输入传进去,放在尾巴上即可。

参考

https://keras-cn.readthedocs.io/en/latest/layers/core_layer/#lambda

(个人觉得这份文档某些地方比官方中文要完整许多)

keras许多简单操作,都需要新建一个层,使用Lambda可以很好完成需求。当你不知道有这个东西存在的时候,就会走不少弯路。

以上这篇浅谈keras中的Merge层(实现层的相加、相减、相乘实例)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
爬山算法简介和Python实现实例
Apr 26 Python
Django中对数据查询结果进行排序的方法
Jul 17 Python
Python实现拷贝多个文件到同一目录的方法
Sep 19 Python
解决Pandas to_json()中文乱码,转化为json数组的问题
May 10 Python
网易2016研发工程师编程题 奖学金(python)
Jun 19 Python
Django使用unittest模块进行单元测试过程解析
Aug 02 Python
Python检查图片是否损坏及图片类型是否正确过程详解
Sep 30 Python
python3.x 生成3维随机数组实例
Nov 28 Python
numpy np.newaxis 的实用分享
Nov 30 Python
解决Numpy中sum函数求和结果维度的问题
Dec 06 Python
Python递归实现打印多重列表代码
Feb 27 Python
使用Python实现音频双通道分离
Dec 25 Python
Keras实现将两个模型连接到一起
May 23 #Python
keras 获取某层输出 获取复用层的多次输出实例
May 23 #Python
给keras层命名,并提取中间层输出值,保存到文档的实例
May 23 #Python
keras小技巧——获取某一个网络层的输出方式
May 23 #Python
keras自定义回调函数查看训练的loss和accuracy方式
May 23 #Python
Keras设定GPU使用内存大小方式(Tensorflow backend)
May 22 #Python
tensorflow使用L2 regularization正则化修正overfitting过拟合方式
May 22 #Python
You might like
PHP实现对站点内容外部链接的过滤方法
2014/09/10 PHP
php连接oracle数据库及查询数据的方法
2014/12/29 PHP
自己写了一个展开和收起的多更能型的js效果
2013/03/05 Javascript
解读JavaScript中 For, While与递归的用法
2013/05/07 Javascript
javascript中数组的多种定义方法和常用函数简介
2014/05/09 Javascript
javascript实现获取浏览器版本、浏览器类型
2015/12/02 Javascript
原生javascript实现的一个简单动画效果
2016/03/30 Javascript
用Angular实时获取本地Localstorage数据,实现一个模拟后台数据登入的效果
2016/11/09 Javascript
jquery插件treegrid树状表格的使用方法详解(.Net平台)
2017/01/03 Javascript
laydate.js日期时间选择插件
2017/01/04 Javascript
jQuery实现搜索页面关键字的功能
2017/02/16 Javascript
JavaScript设置名字输入不合法的实现方法
2017/05/23 Javascript
Jquery中.bind()、.live()、.delegate()和.on()之间的区别详解
2017/08/01 jQuery
JS基于ES6新特性async await进行异步处理操作示例
2019/02/02 Javascript
Vue.js中的组件系统
2019/05/30 Javascript
tracking.js实现前端人脸识别功能
2020/04/16 Javascript
[09:13]2014DOTA2国际邀请赛 中国区预选赛coser表演
2014/05/23 DOTA
理解Python中的类与实例
2015/04/27 Python
简单讲解Python中的数字类型及基本的数学计算
2016/03/11 Python
python使用rpc框架gRPC的方法
2018/08/24 Python
Python使用到第三方库PyMuPDF图片与pdf相互转换
2019/05/03 Python
Python正则表达式实现简易计算器功能示例
2019/05/07 Python
Django如何简单快速实现PUT、DELETE方法
2019/07/24 Python
手机使用python操作图片文件(pydroid3)过程详解
2019/09/25 Python
35款精致的 CSS3 和 HTML5 网页模板 推荐
2012/08/03 HTML / CSS
Carolina Lemke Berlin澳大利亚官网:时尚太阳镜品牌
2019/09/17 全球购物
马来西亚在线购物市场:PGMall.my
2019/10/13 全球购物
POS解决方案:MUNBYN(热敏打印机、条形码扫描仪)
2020/06/09 全球购物
英文版网络工程师求职信
2013/10/28 职场文书
主题团日活动总结
2014/06/25 职场文书
初中作文评语
2014/12/25 职场文书
2015年医务科工作总结范文
2015/05/26 职场文书
党员干部学习心得体会
2016/01/23 职场文书
PostgreSQL自动更新时间戳实例代码
2021/11/27 PostgreSQL
Python识别花卉种类鉴定网络热门植物并自动整理分类
2022/04/08 Python
Go微服务项目配置文件的定义和读取示例详解
2022/06/21 Golang