使用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 字典(Dictionary)操作详解
Mar 11 Python
python在windows下实现ping操作并接收返回信息的方法
Mar 20 Python
python字符串中的单双引
Feb 16 Python
Python中str.format()详解
Mar 12 Python
Python二叉树定义与遍历方法实例分析
May 25 Python
Python二进制串转换为通用字符串的方法
Jul 23 Python
Python实现制度转换(货币,温度,长度)
Jul 14 Python
python 基于dlib库的人脸检测的实现
Nov 08 Python
Python3常用内置方法代码实例
Nov 18 Python
Jupyter Notebook折叠输出的内容实例
Apr 22 Python
python将logging模块封装成单独模块并实现动态切换Level方式
May 12 Python
关于python3 opencv 图像二值化的问题(cv2.adaptiveThreshold函数)
Apr 04 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
fleaphp crud操作之find函数的使用方法
2011/04/23 PHP
php常用正则函数实例小结
2016/12/29 PHP
PHP中的Iterator迭代对象属性详解
2019/04/12 PHP
php解决安全问题的方法实例
2019/09/19 PHP
PHP如何通过带尾指针的链表实现'队列'
2020/10/22 PHP
如何简单地用YUI做JavaScript动画
2007/03/10 Javascript
JS连连看源码完美注释版(推荐)
2013/12/09 Javascript
jQuery插件MixItUp实现动画过滤和排序
2015/04/12 Javascript
jQuery实现form表单元素序列化为json对象的方法
2015/12/09 Javascript
jQuery获取DOM节点实例分析(2种方式)
2015/12/15 Javascript
分享有关jQuery中animate、slide、fade等动画的连续触发、滞后反复执行的bug
2016/01/10 Javascript
JavaScript定时器实现的原理分析
2016/12/06 Javascript
nodejs基础知识
2017/02/03 NodeJs
Popup弹出框添加数据实现方法
2017/10/27 Javascript
vue学习笔记五:在vue项目里面使用引入公共方法详解
2019/04/04 Javascript
vue.js中导出Excel表格的案例分析
2019/06/11 Javascript
node.js中stream流中可读流和可写流的实现与使用方法实例分析
2020/02/13 Javascript
JavaScript中EventBus实现对象之间通信
2020/10/18 Javascript
解决VUE项目使用Element-ui 下拉组件的验证失效问题
2020/11/07 Javascript
[01:00:14]DOTA2-DPC中国联赛 正赛 Ehome vs Elephant BO3 第二场 2月28日
2021/03/11 DOTA
Python常用随机数与随机字符串方法实例
2015/04/09 Python
基于MTCNN/TensorFlow实现人脸检测
2018/05/24 Python
python机器人运动范围问题的解答
2019/04/29 Python
python并发编程多进程 互斥锁原理解析
2019/08/20 Python
浅谈pytorch池化maxpool2D注意事项
2020/02/18 Python
美国零售商店:Blue&Cream
2017/04/07 全球购物
印尼太阳百货公司网站:Matahari
2018/02/04 全球购物
大学生蛋糕店创业计划书
2014/01/13 职场文书
医院辞职信范文
2014/01/17 职场文书
2014年入党积极分子党课学习心得体会模板
2014/04/03 职场文书
公司经理任命书
2014/06/05 职场文书
三严三实心得体会范文
2014/10/13 职场文书
2015年大学元旦晚会活动策划书
2014/12/09 职场文书
清洁工个人工作总结
2015/03/05 职场文书
Python使用OpenCV实现虚拟缩放效果
2022/02/28 Python
vue组件vue-esign实现电子签名
2022/04/21 Vue.js