使用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使用gensim计算文档相似性
Apr 10 Python
Python自动生产表情包
Mar 17 Python
Python实现对象转换为xml的方法示例
Jun 08 Python
Python分支结构(switch)操作简介
Jan 17 Python
Python 记录日志的灵活性和可配置性介绍
Feb 27 Python
Python基于百度AI的文字识别的示例
Apr 21 Python
数组保存为txt, npy, csv 文件, 数组遍历enumerate的方法
Jul 09 Python
python 读取摄像头数据并保存的实例
Aug 03 Python
详解python websocket获取实时数据的几种常见链接方式
Jul 01 Python
Python之修改图片像素值的方法
Jul 03 Python
django model 条件过滤 queryset.filter(**condtions)用法详解
May 20 Python
Flask-SocketIO服务端安装及使用代码示例
Nov 26 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
网页游戏开发入门教程二(游戏模式+系统)
2009/11/02 PHP
在IIS7.0下面配置PHP 5.3.2运行环境的方法
2010/04/13 PHP
PHP快速按行读取CSV大文件的封装类分享(也适用于其它超大文本文件)
2014/04/10 PHP
php 解压rar文件及zip文件的方法
2014/05/05 PHP
js压缩利器
2007/02/20 Javascript
JavaScript学习历程和心得小结
2010/08/16 Javascript
基于jquery的滑动样例代码
2010/11/20 Javascript
javascript调试过程中找不到哪里出错的可能原因
2013/12/16 Javascript
给html超链接设置事件不使用href来完成跳
2014/04/20 Javascript
avalon js实现仿google plus图片多张拖动排序附源码下载
2015/09/24 Javascript
js 定义对象数组(结合)多维数组方法
2016/07/27 Javascript
微信小程序 video详解及简单实例
2017/01/16 Javascript
js实现适配不同的屏幕大小
2017/04/10 Javascript
jquery版轮播图效果和extend扩展
2017/07/18 jQuery
vue中mint-ui的使用方法
2018/04/04 Javascript
微信小程序ibeacon三点定位详解
2018/10/31 Javascript
jquery.pager.js实现分页效果
2019/07/29 jQuery
[02:28]PWL开团时刻DAY3——Ink Ice与DeMonsTer之间的勾心斗角
2020/11/03 DOTA
使用BeautifulSoup爬虫程序获取百度搜索结果的标题和url示例
2014/01/19 Python
Python使用Mechanize模块编写爬虫的要点解析
2016/03/31 Python
对Python闭包与延迟绑定的方法详解
2019/01/07 Python
vscode 配置 python3开发环境的方法
2019/09/19 Python
pycharm中导入模块错误时提示Try to run this command from the system terminal
2020/03/26 Python
俄罗斯的精英皮具:Wittchen
2018/01/29 全球购物
AT&T Wireless:手机、无限数据计划和配件
2018/06/03 全球购物
Lookfantastic俄罗斯:欧洲在线化妆品零售商
2019/08/06 全球购物
美国家居装饰网上商店:Lulu & Georgia
2019/09/14 全球购物
幼儿园秋游活动方案
2014/01/21 职场文书
艺术设计专业求职自荐信
2014/05/19 职场文书
毕业生求职信范文
2014/06/29 职场文书
新郎答谢词
2015/01/04 职场文书
周年庆典答谢词
2015/01/20 职场文书
会计工作能力自我评价
2015/03/05 职场文书
办公室管理规章制度
2015/08/04 职场文书
2015年四年级班主任工作总结
2015/10/22 职场文书
使用Python获取字典键对应值的方法
2022/04/26 Python