使用Keras实现Tensor的相乘和相加代码


Posted in Python onJune 18, 2020

前言

最近在写行为识别的代码,涉及到两个网络的融合,这个融合是有加权的网络结果的融合,所以需要对网络的结果进行加权(相乘)和融合(相加)。

最初的想法

最初的想法是用Keras.layers.Add和Keras.layers.Multiply来做,后来发现这样会报错。

rate_rgb = k.variable(np.ones((1024,),dtype='float32')*0.8)
rate_esti = k.variable(np.ones((1024,),dtype='float32')*0.2)
weight_gru1 = Multiply()([rate_rgb,gru1])
weight_gru2 = Multiply()([rate_esti,gru2])
last = Add()([weight_gru1,weight_gru2])

这么写会报错,如下

AttributeError: 'Variable' object has no attribute '_keras_history'

正确做法

后来在网上参考大神的博客,改为如下

weight_1 = Lambda(lambda x:x*0.8)
weight_2 = Lambda(lambda x:x*0.2)
weight_gru1 = weight_1(gru1)
weight_gru2 = weight_2(gru2)
last = Add()([weight_gru1,weight_gru2])

这样就没问题了。

补充知识: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实现Tensor的相乘和相加代码就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
21行Python代码实现拼写检查器
Jan 25 Python
python 简单的绘图工具turtle使用详解
Jun 21 Python
用Python删除本地目录下某一时间点之前创建的所有文件的实例
Dec 14 Python
用Python PIL实现几个简单的图片特效
Jan 18 Python
Python实现对特定列表进行从小到大排序操作示例
Feb 11 Python
Python 中包/模块的 `import` 操作代码
Apr 22 Python
TensorFlow车牌识别完整版代码(含车牌数据集)
Aug 05 Python
Python3.7 pyodbc完美配置访问access数据库
Oct 03 Python
改变 Python 中线程执行顺序的方法
Sep 24 Python
python UIAutomator2使用超详细教程
Feb 19 Python
使用Python的开发框架Brownie部署以太坊智能合约
May 28 Python
详解OpenCV获取高动态范围(HDR)成像
Apr 29 Python
python如何从键盘获取输入实例
Jun 18 #Python
Python计算信息熵实例
Jun 18 #Python
python导入库的具体方法
Jun 18 #Python
如何基于Python代码实现高精度免费OCR工具
Jun 18 #Python
python软件都是免费的吗
Jun 18 #Python
python中return如何写
Jun 18 #Python
python对一个数向上取整的实例方法
Jun 18 #Python
You might like
php循环输出数据库内容的代码
2008/05/24 PHP
安装apache2.2.22配置php5.4(具体操作步骤)
2013/06/26 PHP
基于CakePHP实现的简单博客系统实例
2015/06/28 PHP
php中array_slice和array_splice函数解析
2016/10/18 PHP
thinkphp3.2嵌入百度编辑器ueditor的实例代码
2017/07/13 PHP
PHP命令空间namespace及use的用法小结
2017/11/27 PHP
javascript利用控件对windows的操作实现原理与应用
2012/12/23 Javascript
js整数字符串转换为金额类型数据(示例代码)
2013/12/26 Javascript
JS实现窗口加载时模拟鼠标移动的方法
2015/06/03 Javascript
JavaScript控制浏览器全屏及各种浏览器全屏模式的方法、属性和事件
2015/12/20 Javascript
详解用vue-cli来搭建vue项目和webpack
2017/04/20 Javascript
Node.js创建Web、TCP服务器
2017/12/05 Javascript
解决JS表单验证只有第一个IF起作用的问题
2018/12/04 Javascript
说说如何在Vue.js中实现数字输入组件的方法
2019/01/08 Javascript
详解一个小实例理解js原型和继承
2019/04/24 Javascript
Python splitlines使用技巧
2008/09/06 Python
使用70行Python代码实现一个递归下降解析器的教程
2015/04/17 Python
浅谈Python类里的__init__方法函数,Python类的构造函数
2016/12/10 Python
python中logging模块的一些简单用法的使用
2019/02/22 Python
手把手教你使用Python创建微信机器人
2019/04/29 Python
Python+OpenCV 实现图片无损旋转90°且无黑边
2019/12/12 Python
python DataFrame转dict字典过程详解
2019/12/26 Python
Python利用myqr库创建自己的二维码
2020/11/24 Python
python实现控制台输出颜色
2021/03/02 Python
HTML5 Plus 实现手机APP拍照或相册选择图片上传功能
2016/07/13 HTML / CSS
在HTML5 Canvas中放入图片和保存为图片的方法
2014/05/03 HTML / CSS
美国现代家具网站:Design Within Reach
2018/07/19 全球购物
学习心得体会
2014/01/01 职场文书
农民入党思想汇报
2014/01/03 职场文书
市场营销专业大学生职业生涯规划文
2014/03/06 职场文书
大二学习计划书范文
2014/04/27 职场文书
党性分析自查总结
2014/10/14 职场文书
2015感人爱情寄语
2015/02/26 职场文书
公司借条范本
2015/05/25 职场文书
《彼得与狼》教学反思
2016/02/20 职场文书
如何在Mac上通过docker配置PHP开发环境
2021/05/29 PHP