使用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中使用列表生成式的教程
Apr 27 Python
如何处理Python3.4 使用pymssql 乱码问题
Jan 08 Python
详解Python中open()函数指定文件打开方式的用法
Jun 04 Python
Python模拟用户登录验证
Sep 11 Python
Django中Forms的使用代码解析
Feb 10 Python
python操作excel的包(openpyxl、xlsxwriter)
Jun 11 Python
Python后台管理员管理前台会员信息的讲解
Jan 28 Python
PyQt5 QListWidget选择多项并返回的实例
Jun 17 Python
Python3 执行Linux Bash命令的方法
Jul 12 Python
使用python实现kNN分类算法
Oct 16 Python
python 基于dlib库的人脸检测的实现
Nov 08 Python
基于Python快速处理PDF表格数据
Jun 03 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与SQL注入攻击[二]
2007/04/17 PHP
大家都应该掌握的PHP关联数组使用技巧
2015/12/25 PHP
使javascript也能包含文件
2006/10/26 Javascript
学习YUI.Ext第五日--做拖放Darg&Drop
2007/03/10 Javascript
javascript 事件绑定问题
2011/01/01 Javascript
jQuery1.4.2与老版本json格式兼容的解决方法
2011/02/12 Javascript
原生js实现shift/ctrl/alt按键的获取
2013/04/08 Javascript
Javascript 拖拽雏形中的一些问题(逐行分析代码,让你轻松了拖拽的原理)
2015/01/23 Javascript
BootStrap便签页的简单应用
2017/01/06 Javascript
nodejs+express实现文件上传下载管理网站
2017/03/15 NodeJs
微信小程序 下拉菜单的实现
2017/04/06 Javascript
Angular.js中下拉框实现渲染html的方法
2017/06/18 Javascript
js中的事件委托或是事件代理使用详解
2017/06/23 Javascript
详细分析jsonp的原理和实现方式
2017/11/20 Javascript
把vue-router和express项目部署到服务器的方法
2018/02/21 Javascript
JS实现获取word文档内容并输出显示到html页面示例
2018/06/23 Javascript
angular6.0开发教程之如何安装angular6.0框架
2018/06/29 Javascript
解决Vue 项目打包后favicon无法正常显示的问题
2018/09/01 Javascript
Vue前后端不同端口的实现方法
2018/09/19 Javascript
微信小程序实现图片翻转效果的实例代码
2019/09/20 Javascript
Jquery $.map使用方法实例详解
2020/09/01 jQuery
[02:26]2016国际邀请赛8月3日开战 中国军团出征西雅图
2016/08/02 DOTA
给你选择Python语言实现机器学习算法的三大理由
2017/11/15 Python
python函数式编程学习之yield表达式形式详解
2018/03/25 Python
详解python实现交叉验证法与留出法
2019/07/11 Python
python 生成器和迭代器的原理解析
2019/10/12 Python
Django正则URL匹配实现流程解析
2020/11/13 Python
ManoMano英国:欧洲第一家专注于DIY和园艺市场的电商平台
2020/03/12 全球购物
人事主管岗位职责范本
2013/12/04 职场文书
股东合作协议书范本
2014/04/14 职场文书
教师自我剖析材料
2014/09/29 职场文书
退学证明范本3篇
2014/10/29 职场文书
培训简讯范文
2015/07/20 职场文书
公司档案管理制度
2015/08/05 职场文书
2016元旦晚会主持人开场白和结束语
2015/12/03 职场文书
导游词创作书写原则以及开场白技巧怎么学?
2019/09/25 职场文书