使用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 22 Python
DataFrame 将某列数据转为数组的方法
Apr 13 Python
pandas通过loc生成新的列方法
Nov 28 Python
Python基于Tkinter模块实现的弹球小游戏
Dec 27 Python
在Pycharm中使用GitHub的方法步骤
Jun 13 Python
python Pandas如何对数据集随机抽样
Jul 29 Python
Python基础之函数基本用法与进阶详解
Jan 02 Python
使用 tf.nn.dynamic_rnn 展开时间维度方式
Jan 21 Python
Python selenium页面加载慢超时的解决方案
Mar 18 Python
pandas分批读取大数据集教程
Jun 06 Python
利用keras使用神经网络预测销量操作
Jul 07 Python
快速创建python 虚拟环境
Nov 28 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
复杂检索数据并分页显示的处理方法
2006/10/09 PHP
php下清空字符串中的HTML标签的代码
2010/09/06 PHP
实例简介PHP的一些高级面向对象编程的特性
2015/11/27 PHP
PHP中ajax无刷新上传图片与图片下载功能
2017/02/21 PHP
php+ajax实现仿百度查询下拉内容功能示例
2017/10/20 PHP
php实现微信公众号企业转账功能
2018/10/01 PHP
NiftyCube——轻松实现圆角边框
2007/02/20 Javascript
textContent在Firefox下与innerText等效的属性
2007/05/12 Javascript
原生javascript获取元素样式
2014/12/31 Javascript
详解Javacript和AngularJS中的Promises
2016/02/09 Javascript
数组Array的一些方法(总结)
2017/02/17 Javascript
详解JS中的立即执行函数
2017/02/24 Javascript
Vuejs 组件——props数据传递的实例代码
2017/03/07 Javascript
jQuery中animate()的使用方法及解决$(”body“).animate({“scrollTop”:top})不被Firefox支持的问题
2017/04/04 jQuery
AngularJS 购物车全选/取消全选功能的实现方法
2017/08/14 Javascript
Vue ElementUI之Form表单验证遇到的问题
2017/08/21 Javascript
Angular5中调用第三方库及jQuery的添加的方法
2018/06/07 jQuery
每个 JavaScript 工程师都应懂的33个概念
2018/10/22 Javascript
vue的for循环使用方法
2019/02/12 Javascript
JS中min函数实例讲解
2019/02/18 Javascript
JS事件绑定的常用方式实例总结
2019/03/02 Javascript
Vue注册组件命名时不能用大写的原因浅析
2019/04/25 Javascript
VUE使用 wx-open-launch-app 组件开发微信打开APP功能
2020/08/11 Javascript
图解JS原型和原型链实现原理
2020/09/15 Javascript
JSONObject与JSONArray使用方法解析
2020/09/28 Javascript
分析在Python中何种情况下需要使用断言
2015/04/01 Python
每天迁移MySQL历史数据到历史库Python脚本
2018/04/13 Python
pycharm下查看python的变量类型和变量内容的方法
2018/06/26 Python
对python pandas 画移动平均线的方法详解
2018/11/28 Python
使用Python求解带约束的最优化问题详解
2020/02/11 Python
英国银首饰公司:e&e Jewellery
2021/02/11 全球购物
建筑个人求职信范文
2014/01/25 职场文书
表彰会主持词
2014/03/26 职场文书
开学典礼演讲稿
2014/05/23 职场文书
上党课的心得体会
2014/09/02 职场文书
工作态度不端正检讨书
2014/10/04 职场文书