使用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 相关文章推荐
使用Python绘制图表大全总结
Feb 11 Python
python实现决策树
Dec 21 Python
python通过elixir包操作mysql数据库实例代码
Jan 31 Python
java中两个byte数组实现合并的示例
May 09 Python
python实现txt文件格式转换为arff格式
May 31 Python
在Pycharm中对代码进行注释和缩进的方法详解
Jan 20 Python
python实现通过flask和前端进行数据收发
Aug 22 Python
Python实现串口通信(pyserial)过程解析
Sep 25 Python
Python bytes string相互转换过程解析
Mar 05 Python
在 Pycharm 安装使用black的方法详解
Apr 02 Python
PyCharm2019 安装和配置教程详解附激活码
Jul 31 Python
Python tensorflow卷积神经Inception V3网络结构
May 06 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建立文件夹代码
2015/01/06 PHP
php+curl 发送图片处理代码分享
2015/07/09 PHP
Laravel 验证码认证学习记录小结
2019/12/20 PHP
js 动态添加标签(新增一行,其实很简单,就是几个函数的应用)
2009/03/26 Javascript
关于用Jquery的height()、width()计算动态插入的IMG标签的宽高的问题
2010/12/08 Javascript
IE6浏览器下resize事件被执行了多次解决方法
2012/12/11 Javascript
jquery实现的可隐藏重现的靠边悬浮层实例代码
2013/05/27 Javascript
jquery实现文字由下到上循环滚动的实例代码
2013/08/09 Javascript
js自动生成的元素与页面原有元素发生堆叠的解决方法
2013/10/24 Javascript
JavaScript判断访问的来源是手机还是电脑,用的哪种浏览器
2013/12/12 Javascript
js调用浏览器打印模块实现点击按钮触发自定义函数
2014/03/21 Javascript
jQuery通过控制节点实现仅在前台通过get方法完成参数传递
2015/02/02 Javascript
jQuery获取访问者IP地址的方法(基于新浪API与QQ查询接口)
2016/05/25 Javascript
jQuery获取radio选中项的值实例
2016/06/18 Javascript
关于JS 预解释的相关理解
2016/06/28 Javascript
JavaScript SHA-256加密算法详细代码
2016/10/06 Javascript
jquery 校验中国身份证号码实例详解
2017/04/11 jQuery
jquery仿京东商品放大浏览页面
2017/06/06 jQuery
jQuery+CSS实现的table表格行列转置功能示例
2018/01/08 jQuery
使用vue-cli创建项目的图文教程(新手入门篇)
2018/05/02 Javascript
vue 实现在同一界面实现组件的动态添加和删除功能
2020/06/16 Javascript
Python初学者需要注意的事项小结(python2与python3)
2018/09/26 Python
Python生成器实现简单"生产者消费者"模型代码实例
2020/03/27 Python
Python map及filter函数使用方法解析
2020/08/06 Python
梵蒂冈和罗马卡:Omnia Card Pass
2018/02/10 全球购物
波兰补充商店:Muscle Power
2018/10/29 全球购物
优秀应届生求职信
2014/06/16 职场文书
中学生社会实践活动总结
2014/07/03 职场文书
党员学习正风肃纪思想汇报
2014/09/12 职场文书
群众路线党员个人剖析材料
2014/10/08 职场文书
开展党的群众路线教育实践活动剖析材料
2014/10/13 职场文书
国际贸易实训报告
2014/11/05 职场文书
Python数据分析之pandas函数详解
2021/04/21 Python
基于flask实现五子棋小游戏
2021/05/25 Python
JavaScript 中for/of,for/in 的详细介绍
2021/11/17 Javascript
Python数据处理的三个实用技巧分享
2022/04/01 Python