使用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检测lvs real server状态
Jan 22 Python
Flask入门教程实例:搭建一个静态博客
Mar 27 Python
python爬取m3u8连接的视频
Feb 28 Python
Python使用pandas对数据进行差分运算的方法
Dec 22 Python
使用python3实现操作串口详解
Jan 01 Python
漂亮的Django Markdown富文本app插件的实现
Jan 02 Python
python使用参数对嵌套字典进行取值的方法
Apr 26 Python
用python求一个数组的和与平均值的实现方法
Jun 29 Python
Python3使用xml.dom.minidom和xml.etree模块儿解析xml文件封装函数的方法
Sep 23 Python
解决Python中报错TypeError: must be str, not bytes问题
Apr 07 Python
python 如何把docker-compose.yaml导入到数据库相关条目里
Jan 15 Python
Python如何利用正则表达式爬取网页信息及图片
Apr 17 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多文件上传实现代码
2014/02/20 PHP
laravel5创建service provider和facade的方法详解
2016/07/26 PHP
PHP+Ajax实现的无刷新分页功能详解【附demo源码下载】
2017/07/03 PHP
laravel框架学习笔记之组件化开发实现方法
2020/02/01 PHP
再谈IE中Flash控件的自动激活 ObjectWrap
2007/03/09 Javascript
Ext JS 4实现带week(星期)的日期选择控件(实战二)
2013/08/21 Javascript
浅谈javascript 归并方法
2015/01/21 Javascript
jQuery插件Tmpl的简单使用方法
2015/04/27 Javascript
浅析nodejs实现Websocket的数据接收与发送
2015/11/19 NodeJs
JS获取CSS样式(style/getComputedStyle/currentStyle)
2016/01/19 Javascript
JS实现HTML表格排序功能
2016/08/05 Javascript
使用BootStrap和Metroui设计的metro风格微网站或手机app界面
2016/10/21 Javascript
pc加载更多功能和移动端下拉刷新加载数据
2016/11/07 Javascript
vuejs绑定class和style样式
2017/04/11 Javascript
基于VUE.JS的移动端框架Mint UI的使用
2017/10/11 Javascript
vue+webpack实现异步加载三种用法示例详解
2018/04/24 Javascript
引入外部js脚本加载慢与页面白屏问题的解决
2018/12/10 Javascript
构建Vue大型应用的10个最佳实践(小结)
2019/11/07 Javascript
python判断图片宽度和高度后删除图片的方法
2015/05/22 Python
Python基于DES算法加密解密实例
2015/06/03 Python
关于Python数据结构中字典的心得
2017/12/04 Python
Python编程求质数实例代码
2018/01/31 Python
Python实现的简单计算器功能详解
2018/08/25 Python
Python实现带参数的用户验证功能装饰器示例
2018/12/14 Python
flask 使用 flask_apscheduler 做定时循环任务的实现
2019/12/10 Python
Python Tornado核心及相关原理详解
2020/06/24 Python
使用css3和jquery实现可伸缩搜索框
2014/02/12 HTML / CSS
HTML5 canvas实现雪花飘落特效
2016/03/08 HTML / CSS
Agoda中文官网:安可达(低价预订全球酒店)
2021/01/18 全球购物
简述数组与指针的区别
2014/01/02 面试题
函授本科自我鉴定
2013/11/03 职场文书
个人简历中的自我评价怎么写
2014/01/26 职场文书
餐厅筹备计划书
2014/04/25 职场文书
文艺演出策划方案
2014/06/07 职场文书
企业宣传口号
2014/06/12 职场文书
在HTML5 localStorage中存储对象的示例代码
2021/04/21 Javascript