使用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 28 Python
基于python元祖与字典与集合的粗浅认识
Aug 23 Python
Python+tkinter模拟“记住我”自动登录实例代码
Jan 16 Python
详解python OpenCV学习笔记之直方图均衡化
Feb 08 Python
浅谈Python的条件判断语句if/else语句
Mar 21 Python
django 微信网页授权认证api的步骤详解
Jul 30 Python
python实现输出一个序列的所有子序列示例
Nov 18 Python
numpy实现神经网络反向传播算法的步骤
Dec 24 Python
Pyspark读取parquet数据过程解析
Mar 27 Python
python中查看.db文件中表格的名字及表格中的字段操作
Jul 07 Python
Python如何发送与接收大型数组
Aug 07 Python
python3获取控制台输入的数据的具体实例
Aug 16 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/01/08 PHP
PHP实现仿百度文库,豆丁在线文档效果(word,excel,ppt转flash)
2016/03/10 PHP
php中数组最简单的使用方法
2020/12/27 PHP
jquery HotKeys轻松搞定键盘事件代码
2008/08/30 Javascript
重构Javascript代码示例(重构前后对比)
2013/01/23 Javascript
jQuery获得内容和属性示例代码
2014/01/16 Javascript
javascript作用域链(Scope Chain)用法实例解析
2015/11/30 Javascript
JS 面向对象之继承---多种组合继承详解
2016/07/10 Javascript
原生js实现class的添加和删除简单代码
2016/07/12 Javascript
JQuery对ASP.NET MVC数据进行更新删除
2016/07/13 Javascript
JS中的数组方法笔记整理
2016/07/26 Javascript
js获取浏览器和屏幕的各种宽度高度
2017/02/22 Javascript
Angular2自定义分页组件
2017/04/19 Javascript
jquery DataTable实现前后台动态分页
2017/06/17 jQuery
vue父子组件的嵌套的示例代码
2017/09/08 Javascript
使用vue2实现购物车和地址选配功能
2018/03/29 Javascript
node前端开发模板引擎Jade的入门
2018/05/11 Javascript
JavaScript原型对象、构造函数和实例对象功能与用法详解
2018/08/04 Javascript
angularjs性能优化的方法
2018/09/05 Javascript
举例讲解Django中数据模型访问外键值的方法
2015/07/21 Python
将Python的Django框架与认证系统整合的方法
2015/07/24 Python
django开发之settings.py中变量的全局引用详解
2017/03/29 Python
详解Python之数据序列化(json、pickle、shelve)
2017/03/30 Python
Python2随机数列生成器简单实例
2017/09/04 Python
完美解决Pycharm无法导入包的问题 Unresolved reference
2018/05/18 Python
python中时间模块的基本使用教程
2019/05/14 Python
Django框架自定义session处理操作示例
2019/05/27 Python
python 实现提取log文件中的关键句子,并进行统计分析
2019/12/24 Python
浅析border-radius如何兼容IE
2016/04/19 HTML / CSS
Timberland美国官网:全球领先的户外品牌
2016/08/15 全球购物
美国当红的名品折扣网:Gilt Groupe
2016/08/15 全球购物
英国文胸专家:AmpleBosom.com
2018/02/06 全球购物
倡议书格式模板
2014/05/13 职场文书
校庆标语集锦
2014/06/25 职场文书
用CSS3画一个爱心
2021/04/27 HTML / CSS
python单向链表实例详解
2022/05/25 Python