浅谈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之再深点,更懂list
Sep 20 Python
Python实现检测服务器是否可以ping通的2种方法
Jan 01 Python
Python中使用PIPE操作Linux管道
Feb 04 Python
Python中动态创建类实例的方法
Mar 24 Python
Scrapy的简单使用教程
Oct 24 Python
python对离散变量的one-hot编码方法
Jul 11 Python
对python产生随机的二维数组实例详解
Dec 13 Python
解决Python安装时报缺少DLL问题【两种解决方法】
Jul 15 Python
Django的models中on_delete参数详解
Jul 16 Python
Python 调用 Outlook 发送邮件过程解析
Aug 08 Python
Python3多线程版TCP端口扫描器
Aug 31 Python
python如何编写类似nmap的扫描工具
Nov 06 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手册及PHP编程标准
2006/12/17 PHP
PHP垃圾回收机制简单说明
2010/07/22 PHP
php处理restful请求的路由类分享
2014/02/27 PHP
推荐25款php中非常有用的类库
2014/09/29 PHP
总结PHP中初始化空数组的最佳方法
2019/02/13 PHP
phpstorm最新激活码分享亲测phpstorm2020.2.3版可用
2020/11/22 PHP
不错的新闻标题颜色效果
2006/12/10 Javascript
大家未必知道的Js技巧收藏
2008/04/07 Javascript
JQuery 1.4 中的Ajax问题
2010/01/23 Javascript
Jquery EasyUI的添加,修改,删除,查询等基本操作介绍
2013/10/11 Javascript
JavaScript格式化日期时间的方法和自定义格式化函数示例
2014/04/04 Javascript
js星星评分效果
2014/07/24 Javascript
angular简介和其特点介绍
2015/01/29 Javascript
javascript表单处理具体实现代码(表单、链接、按钮)
2016/05/07 Javascript
关于动态生成dom绑定事件失效的原因及解决方法
2016/08/06 Javascript
微信小程序实现跟随菜单效果和循环嵌套加载数据
2017/11/21 Javascript
微信小程序模板和模块化用法实例分析
2017/11/28 Javascript
JS基于开关思想实现的数组去重功能【案例】
2019/02/18 Javascript
javascript定时器的简单应用示例【控制方块移动】
2019/06/17 Javascript
使用vue中的混入mixin优化表单验证插件问题
2019/07/02 Javascript
jQuery插件simplePagination的使用方法示例
2020/04/28 jQuery
element 动态合并表格的步骤
2020/12/31 Javascript
python分割文件的常用方法
2014/11/01 Python
在DigitalOcean的服务器上部署flaskblog应用
2015/12/19 Python
Python常见的pandas用法demo示例
2019/03/16 Python
GitHub 热门:Python 算法大全,Star 超过 2 万
2019/04/29 Python
HTML5+CSS3绘制锯齿状的矩形
2016/03/01 HTML / CSS
Emma Bridgewater官网:英国餐具制造商
2019/11/24 全球购物
党的群众路线对照检查材料(个人)
2014/09/24 职场文书
群众路线教育实践活动民主生活会个人检查对照思想汇报
2014/10/04 职场文书
护士医德考评自我评价
2015/03/03 职场文书
统招统分证明
2015/06/23 职场文书
Java Kafka 消费积压监控的示例代码
2021/07/01 Java/Android
淡雅古典唯美少女娇媚宁静迷人写真
2022/03/21 杂记
golang生成vcf通讯录格式文件详情
2022/03/25 Golang
Python find()、rfind()方法及作用
2022/12/24 Python