使用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基础入门学习笔记(Python环境搭建)
Jan 13 Python
Python自动发邮件脚本
Mar 31 Python
用pickle存储Python的原生对象方法
Apr 28 Python
Python入门之三角函数sin()函数实例详解
Nov 08 Python
解读python logging模块的使用方法
Apr 17 Python
为何人工智能(AI)首选Python?读完这篇文章你就知道了(推荐)
Apr 06 Python
python中的函数递归和迭代原理解析
Nov 14 Python
Python中bisect的使用方法
Dec 31 Python
python 装饰器功能与用法案例详解
Mar 06 Python
Python3.8安装Pygame教程步骤详解
Aug 14 Python
关于PyCharm安装后修改路径名称使其可重新打开的问题
Oct 20 Python
python-图片流传输的思路及示例(url转换二维码)
Dec 21 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 循环列出目录内容的函数代码
2010/05/26 PHP
VB中的RasEnumConnections函数返回632错误解决方法
2014/07/29 PHP
简单分析ucenter 会员同步登录通信原理
2014/08/25 PHP
PHP实现的注册,登录及查询用户资料功能API接口示例
2017/06/06 PHP
php实现与python进行socket通信的方法示例
2017/08/30 PHP
Centos7 Yum安装PHP7.2流程教程详解
2019/07/02 PHP
json格式化/压缩工具 Chrome插件扩展版
2010/05/25 Javascript
JS实现图片预加载无需等待
2012/12/21 Javascript
javascript利用控件对windows的操作实现原理与应用
2012/12/23 Javascript
多个js与css文件的合并方法详细说明
2012/12/26 Javascript
jQuery中delegate和on的用法与区别详细解析
2014/01/26 Javascript
第八篇Bootstrap下拉菜单实例代码
2016/06/21 Javascript
jQuery实现自动输入email、时间和域名的方法
2016/08/24 Javascript
jQuery实现圣诞节礼物传送(花式轮播)
2016/12/25 Javascript
angular双向绑定模拟探索
2016/12/26 Javascript
JavaScript DOM节点操作实例小结(新建,删除HTML元素)
2017/01/19 Javascript
Angular ui.bootstrap.pagination分页
2017/01/20 Javascript
React+TypeScript+webpack4多入口配置详解
2019/08/08 Javascript
p5.js实现动态图形临摹
2019/10/23 Javascript
javascript递归函数定义和用法示例分析
2020/07/22 Javascript
在Vue中使用Select选择器拼接label的操作
2020/10/22 Javascript
[02:43]DOTA2英雄基础教程 德鲁伊
2014/01/13 DOTA
[01:02:53]DOTA2上海特级锦标赛主赛事日 - 5 总决赛Liquid VS Secret第二局
2016/03/06 DOTA
Python学习笔记之os模块使用总结
2014/11/03 Python
Python遍历zip文件输出名称时出现乱码问题的解决方法
2015/04/08 Python
Python random模块用法解析及简单示例
2017/12/18 Python
python 执行shell命令并将结果保存的实例
2018/05/11 Python
python 抓包保存为pcap文件并解析的实例
2019/07/23 Python
pandas 对group进行聚合的例子
2019/12/27 Python
利用Python过滤相似文本的简单方法示例
2021/02/03 Python
navabi英国:设计师大码女装
2019/06/25 全球购物
社团活动策划书范文
2014/01/09 职场文书
教师评语大全
2014/04/28 职场文书
读书伴我成长演讲稿
2014/05/07 职场文书
重阳节活动总结
2014/08/27 职场文书
Oracle 区块链表创建过程详解
2021/05/15 Oracle