浅谈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 相关文章推荐
利用Django框架中select_related和prefetch_related函数对数据库查询优化
Apr 01 Python
Python中不同进制的语法及转换方法分析
Jul 27 Python
Python基于pillow判断图片完整性的方法
Sep 18 Python
win与linux系统中python requests 安装
Dec 04 Python
python 读取dicom文件,生成info.txt和raw文件的方法
Jan 24 Python
关于python中密码加盐的学习体会小结
Jul 15 Python
Python中的 sort 和 sorted的用法与区别
Aug 10 Python
Python Django Cookie 简单用法解析
Aug 13 Python
Django项目后台不挂断运行的方法
Aug 31 Python
基于Python实现船舶的MMSI的获取(推荐)
Oct 21 Python
python实现简单反弹球游戏
Apr 12 Python
Python编写nmap扫描工具
Jul 21 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生成条形码大揭秘
2015/09/24 PHP
浅析Yii2中GridView常见操作
2016/04/22 PHP
纯CSS3实现质感细腻丝滑按钮
2021/03/09 HTML / CSS
javascript 面向对象编程 function也是类
2009/09/17 Javascript
lyhucSelect基于Jquery的Select数据联动插件
2011/03/29 Javascript
JS运动框架之分享侧边栏动画实例
2015/03/03 Javascript
nodejs创建web服务器之hello world程序
2015/08/20 NodeJs
AngularJS 模块化详解及实例代码
2016/09/14 Javascript
js在ie下打开对话窗口的方法小结
2016/10/24 Javascript
jQuery中ztree 点击文本框弹出下拉框的实例代码
2017/02/05 Javascript
nodejs个人博客开发第四步 数据模型
2017/04/12 NodeJs
JS 学习总结之正则表达式的懒惰性和贪婪性
2017/07/03 Javascript
基于JavaScript+HTML5 实现打地鼠小游戏逻辑流程图文详解(附完整代码)
2017/11/02 Javascript
微信内置浏览器图片查看器的代码实例
2019/10/08 Javascript
JS实现纵向轮播图(初级版)
2020/01/18 Javascript
node.JS路径解析之PATH模块使用方法详解
2020/02/06 Javascript
node+multer实现图片上传的示例代码
2020/02/18 Javascript
JavaScript代码实现微博批量取消关注功能
2021/02/05 Javascript
Python编码爬坑指南(必看)
2016/06/10 Python
详解Tensorflow数据读取有三种方式(next_batch)
2018/02/01 Python
Python程序打包工具py2exe和PyInstaller详解
2019/06/28 Python
pycharm 批量修改变量名称的方法
2019/08/01 Python
使用Python将字符串转换为格式化的日期时间字符串
2019/09/01 Python
Python 元组拆包示例(Tuple Unpacking)
2019/12/24 Python
python 使用递归回溯完美解决八皇后的问题
2020/02/26 Python
Django实现celery定时任务过程解析
2020/04/21 Python
英国儿童图书网站:Scholastic
2017/03/26 全球购物
匡威爱尔兰官网:Converse爱尔兰
2019/06/09 全球购物
保险专业大专生求职信
2013/10/26 职场文书
《乡愁》教学反思
2014/02/18 职场文书
寒假家长评语大全
2014/04/16 职场文书
优秀学生干部个人事迹材料
2014/06/02 职场文书
民族团结演讲稿范文
2014/08/27 职场文书
2014小学二年级班主任工作总结
2014/12/05 职场文书
php实例化对象的实例方法
2021/11/17 PHP
解决Git推送错误non-fast-forward的方法
2022/06/25 Servers