浅谈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操作RabbitMQ服务器消息队列的远程结果返回
Jun 30 Python
浅谈pandas中shift和diff函数关系
Apr 08 Python
python 给DataFrame增加index行名和columns列名的实现方法
Jun 08 Python
浅谈pycharm下找不到sqlalchemy的问题
Dec 03 Python
python使用KNN算法识别手写数字
Apr 25 Python
利用python和百度地图API实现数据地图标注的方法
May 13 Python
Python函数式编程指南:对生成器全面讲解
Nov 19 Python
Python Numpy数组扩展repeat和tile使用实例解析
Dec 09 Python
python系统指定文件的查找只输出目录下所有文件及文件夹
Jan 19 Python
python 如何停止一个死循环的线程
Nov 24 Python
pycharm Tab键设置成4个空格的操作
Feb 26 Python
python抢购软件/插件/脚本附完整源码
Mar 04 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
apache php模块整合操作指南
2012/11/16 PHP
如何利用php array_multisort函数 对数据库结果进行复杂排序
2013/06/08 PHP
Laravel实现构造函数自动依赖注入的方法
2016/03/16 PHP
php设计模式之工厂模式用法经典实例分析
2019/09/20 PHP
Jquery getJSON方法详细分析
2013/12/26 Javascript
js跨域访问示例(客户端/服务端)
2014/05/19 Javascript
JavaScript中的object转换成number或string规则介绍
2014/12/31 Javascript
谈谈JavaScript中function多重理解
2015/08/28 Javascript
使用JQuery选择HTML遍历函数的方法
2016/09/17 Javascript
bootstrap table实现双击可编辑、添加、删除行功能
2017/09/27 Javascript
浅谈React高阶组件
2018/03/28 Javascript
jQuery实现表格的增、删、改操作示例
2019/01/27 jQuery
解决layui 三级联动下拉框更新时回显的问题
2019/09/03 Javascript
使用JS location实现搜索框历史记录功能
2019/12/23 Javascript
vue 路由守卫(导航守卫)及其具体使用
2020/02/25 Javascript
JS实现躲避粒子小游戏
2020/06/18 Javascript
利用Python绘制数据的瀑布图的教程
2015/04/07 Python
仅用50行代码实现一个Python编写的计算器的教程
2015/04/17 Python
详解python 字符串和日期之间转换 StringAndDate
2017/05/04 Python
基于并发服务器几种实现方法(总结)
2017/12/29 Python
解决pandas read_csv 读取中文列标题文件报错的问题
2018/06/15 Python
python计算两个数的百分比方法
2018/06/29 Python
Python wxpython模块响应鼠标拖动事件操作示例
2018/08/23 Python
keras的三种模型实现与区别说明
2020/07/03 Python
css3 transform及原生js实现鼠标拖动3D立方体旋转
2016/06/20 HTML / CSS
城野医生官方海外旗舰店:风靡亚洲毛孔收敛水
2018/04/26 全球购物
英国天然抗衰老护肤品品牌:Nakin Skin Care
2019/04/16 全球购物
顶撞领导检讨书
2014/01/29 职场文书
乡镇干部先进事迹材料
2014/02/03 职场文书
优秀团队获奖感言
2014/02/19 职场文书
五一劳动节慰问信
2015/02/14 职场文书
2015年基层党支部工作总结
2015/05/21 职场文书
2019请假条的基本格式及范文!
2019/07/05 职场文书
Pytorch 实现变量类型转换
2021/05/17 Python
彻底解决MySQL使用中文乱码的方法
2022/01/22 MySQL
python井字棋游戏实现人机对战
2022/04/28 Python