使用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获取Windows或Linux主机名称通用函数分享
Nov 22 Python
Python实战小程序利用matplotlib模块画图代码分享
Dec 09 Python
python+POP3实现批量下载邮件附件
Jun 19 Python
Python爬虫框架Scrapy基本用法入门教程
Jul 26 Python
关于numpy中eye和identity的区别详解
Nov 29 Python
哪种Python框架适合你?简单介绍几种主流Python框架
Aug 04 Python
利用python批量爬取百度任意类别的图片的实现方法
Oct 07 Python
python实现计算图形面积
Feb 22 Python
tensorflow+k-means聚类简单实现猫狗图像分类的方法
Apr 28 Python
Python打包为exe详细教程
May 18 Python
pandas DataFrame.shift()函数的具体使用
May 24 Python
如何用六步教会你使用python爬虫爬取数据
Apr 06 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写的serv-u的web申请账号的程序
2006/10/09 PHP
一个php作的文本留言本的例子(四)
2006/10/09 PHP
php 获取客户端的真实ip
2009/11/30 PHP
PHP把JPEG图片转换成Progressive JPEG的方法
2014/06/30 PHP
取得单条网站评论以数组形式进行输出
2014/07/28 PHP
PHP实现的通过参数生成MYSQL语句类完整实例
2016/04/11 PHP
php中array_column函数简单实现方法
2016/07/11 PHP
PHP检测数据类型的几种方法(总结)
2017/03/04 PHP
php使用fputcsv实现大数据的导出操作详解
2020/02/27 PHP
javascript 弹出窗口中是否显示地址栏的实现代码
2011/04/14 Javascript
file控件选择上传文件确定后触发的js事件是哪个
2014/03/17 Javascript
Javascript单元测试框架QUnitjs详细介绍
2014/05/08 Javascript
AngularJS中的包含详细介绍及实现示例
2016/07/28 Javascript
浅谈js键盘事件全面控制
2016/12/01 Javascript
jq checkbox 的全选并ajax传参的实例
2017/04/01 Javascript
ionic中的$ionicPlatform.ready事件中的通用设置
2017/06/11 Javascript
用原生JS实现简单的多选框功能
2017/06/12 Javascript
vue-cli系列之vue-cli-service整体架构浅析
2019/01/14 Javascript
js中arguments对象的深入理解
2019/05/14 Javascript
js模拟F11页面全屏显示
2019/09/17 Javascript
vue移动端的左右滑动事件详解
2020/06/17 Javascript
vue使用exif获取图片经纬度的示例代码
2020/12/11 Vue.js
[58:35]OG vs EG 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.22
2019/09/05 DOTA
Python中with及contextlib的用法详解
2017/06/08 Python
Python中字典(dict)合并的四种方法总结
2017/08/10 Python
Python利用递归实现文件的复制方法
2018/10/27 Python
python 画二维、三维点之间的线段实现方法
2019/07/07 Python
python实现微信自动回复机器人功能
2019/07/11 Python
基于Python实现扑克牌面试题
2019/12/11 Python
阿玛尼美妆英国官网:Giorgio Armani Beauty英国
2019/03/28 全球购物
英国婚礼商城:Wedding Mall
2019/11/02 全球购物
献爱心捐款倡议书
2014/05/14 职场文书
园林系毕业生求职信
2014/06/23 职场文书
党干部专题民主生活会对照检查材料思想汇报
2014/10/06 职场文书
群众路线教育实践活动调研报告
2014/11/03 职场文书
DBCA命令行搭建Oracle ADG的流程
2021/06/11 Oracle