浅谈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的闭包和装饰器
Feb 26 Python
python MySQLdb使用教程详解
Mar 20 Python
VSCode下配置python调试运行环境的方法
Apr 06 Python
PyCharm鼠标右键不显示Run unittest的解决方法
Nov 30 Python
Python txt文件加入字典并查询的方法
Jan 15 Python
浅谈python常用程序算法
Mar 22 Python
python pandas模块基础学习详解
Jul 03 Python
flask应用部署到服务器的方法
Jul 12 Python
Python bisect模块原理及常见实例
Jun 17 Python
Python基于正则表达式实现计算器功能
Jul 13 Python
python读取图片颜色值并生成excel像素画的方法实例
Feb 19 Python
Python实现将多张图片合成MP4视频并加入背景音乐
Apr 28 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之数组(遍历顺序)  Laruence原创
2012/06/13 PHP
Zend的Registry机制的使用说明
2013/05/02 PHP
PHP利用hash冲突漏洞进行DDoS攻击的方法分析
2015/03/26 PHP
php遍历类中包含的所有元素的方法
2015/05/12 PHP
php防止用户重复提交表单
2015/11/02 PHP
PhpStorm连接服务器并实现自动上传功能
2020/12/09 PHP
firefox 和 ie 事件处理的细节,研究,再研究 书写同时兼容ie和ff的事件处理代码
2007/04/12 Javascript
JQuery的html(data)方法与<script>脚本块的解决方法
2010/03/09 Javascript
使用Jquery搭建最佳用户体验的登录页面之记住密码自动登录功能(含后台代码)
2011/07/10 Javascript
js中复制行和删除行的操作实例
2013/06/25 Javascript
get(0).tagName获得作用标签示例代码
2014/10/08 Javascript
javascript实现十秒钟后注册按钮可点击的方法
2015/05/13 Javascript
百度地图api如何使用
2015/08/03 Javascript
JS实现可展开折叠层的鼠标拖曳效果
2015/10/09 Javascript
js实现仿微博滚动显示信息的效果
2015/12/21 Javascript
jquery插件jquery.LightBox.js实现点击放大图片并左右点击切换效果(附demo源码下载)
2016/02/25 Javascript
jquery中ajax请求后台数据成功后既不执行success也不执行error的完美解决方法
2017/12/24 jQuery
vue axios基于常见业务场景的二次封装的实现
2018/09/21 Javascript
Vue源码探究之状态初始化
2018/11/14 Javascript
10个最受欢迎的 JavaScript框架(推荐)
2019/04/24 Javascript
使用jquery-easyui的布局layout写后台管理页面的代码详解
2019/06/19 jQuery
通过实例了解Render Props回调地狱解决方案
2020/11/04 Javascript
python设置环境变量的作用整理
2020/02/17 Python
关于keras.layers.Conv1D的kernel_size参数使用介绍
2020/05/22 Python
MxNet预训练模型到Pytorch模型的转换方式
2020/05/25 Python
安装并免费使用Pycharm专业版(学生/教师)
2020/09/24 Python
香港优质食材和美酒专门店:FoodWise
2017/09/01 全球购物
Ashford台湾:以折扣价提供奢华的男女用表款
2019/12/04 全球购物
游戏商店:Eneba
2020/04/25 全球购物
大学生第一学年自我鉴定
2014/09/12 职场文书
群众路线剖析材料(四风问题)
2014/10/08 职场文书
2014年班干部工作总结
2014/11/25 职场文书
小学优秀教师先进事迹材料
2014/12/16 职场文书
酒店温馨提示语
2015/07/14 职场文书
分析Python list操作为什么会错误
2021/11/17 Python
Linux安装Docker详细教程
2022/07/07 Servers