解决TensorFlow调用Keras库函数存在的问题


Posted in Python onJuly 06, 2020

tensorflow在1.4版本引入了keras,封装成库。现想将keras版本的GRU代码移植到TensorFlow中,看到TensorFlow中有Keras库,大喜,故将神经网络定义部分使用Keras的Function API方式进行定义,训练部分则使用TensorFlow来进行编写。一顿操作之后,运行,没有报错,不由得一喜。但是输出结果,发现,和预期的不一样。难道是欠拟合?故采用正弦波预测余弦来验证算法模型。

部分调用keras库代码如上图所示,用正弦波预测余弦波,出现如下现象:

def interface(_input):
  tmp = tf.keras.layers.Dense(10)(_input)
  vad_gru = tf.keras.layers.GRU(24, return_sequences=True)(tmp)
  denoise_output = tf.keras.layers.Dense(1)(vad_gru)
  return denoise_output

波形是断断续续的。而且最后不收敛。

解决TensorFlow调用Keras库函数存在的问题

运行N久。。。之后

基本断定是程序本身的问题,于是通过排查,发现应该是GRU的initial_state没有进行更新导致的。导致波形是断断续续的,没有学习到前一次网络的输出。于是,决定不使用Keras库实现一遍:

部分代码如下:

def interface(_input):
  tmp = tf.keras.layers.Dense(10)(_input)
  gru_cell = tf.nn.rnn_cell.GRUCell(vad_cell_size)
  with tf.name_scope('initial_state'):
    cell_init_state = gru_cell.zero_state(batch_size, dtype=tf.float32)
  cell_outputs, cell_final_state = tf.nn.dynamic_rnn(
    gru_cell, tmp, initial_state=cell_init_state, time_major=False)
  denoise_output = tf.keras.layers.Dense(1)(cell_outputs)
  return denoise_output, cell_init_state, cell_final_state

波形图如下(这才是GRU的正确打开方式啊~):

解决TensorFlow调用Keras库函数存在的问题

再回头看之前写的调用keras,既然知道了是initial_state没有更新,那么如何进行更新呢?

网上查找了大量的资料,说要加上

update_ops = []
for old_value, new_value in layers.updates:
  update_ops.append(tf.assign(old_value, new_value))

但是加上去没有效果,是我加错了还是其他的,大家欢迎指出来

以下是我做的一些尝试,就不一一详细说明了,大家看一下,具体不再展开,有问题大家交流一下,有解决方法的,能够分享出来,感激不尽~

def interface(_input):
  # input_layer = tf.keras.layers.Input([None, 1])
  # input_layer = tf.keras.layers.Input(batch_shape=(50, 20, 1))
  tmp = tf.keras.layers.Dense(10)(_input)
  # tmp = tf.keras.layers.Dense(24)(tmp)
 
  # with tf.variable_scope('vad_gru', reuse=tf.AUTO_REUSE):
  # vad_gru, final_state = tf.keras.layers.GRU(24, return_sequences=True, return_state=True, stateful=True)(tmp)
  # print(vad_gru)
  # _initial_state = vad_gru.zero_state(50, tf.float32)
  # tf.get_variable_scope().reuse_variables()
 
  # vad_gru = tf.contrib.
 
  # tmp = tf.reshape(tmp, [-1, TIME_STEPS, vad_cell_size])
  gru_cell = tf.nn.rnn_cell.GRUCell(vad_cell_size)
  # gru_cell = tf.keras.layers.GRUCell(self.vad_cell_size)
  with tf.name_scope('initial_state'):
    cell_init_state = gru_cell.zero_state(batch_size, dtype=tf.float32)
  cell_outputs, cell_final_state = tf.nn.dynamic_rnn(
    gru_cell, tmp, initial_state=cell_init_state, time_major=False)
  # print(cell_outputs.get_shape().as_list())
 
  # cell_outputs = tf.reshape(cell_outputs, [-1, vad_cell_size])
 
  denoise_output = tf.keras.layers.Dense(1)(cell_outputs)
  print(denoise_output.get_shape().as_list())
 
  # model = tf.keras.models.Model(input_layer, denoise_output)
  # update_ops = []
  # for old_value, new_value in model.layers[1].updates:
  #   update_ops.append(tf.assign(old_value, new_value))
 
  return denoise_output, cell_init_state, cell_final_state

补充知识:TensorFlow和Keras常用方法(避坑)

TensorFlow

在TensorFlow中,除法运算:

1.tensor除法会使结果的精度高一级,可能会导致后面计算类型不匹配,如float32 / float32 = float64。

2.除法需要分子分母同类型,否则报错。

产生类似错误提示如下:

-1.TypeError: x and y must have the same dtype, got tf.float32 != tf.int32

-2.TypeError: Input ‘y' of ‘Mul' Op has type float32 that does not match type float64 of argument ‘x'.

-3.ValueError: Tensor conversion requested dtype float64 for Tensor with dtype float32: ‘Tensor(“Sum:0”, shape=(), dtype=float32)'

-4.ValueError: Incompatible type conversion requested to type ‘int32' for variable of type ‘float32_ref'

解决办法:

tf.cast(a, tf.float32) # 转换成同类型即可

tf.boolean_mask

K.gather

K.argmax

K.max

以上这篇解决TensorFlow调用Keras库函数存在的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python的描述符(descriptor)、装饰器(property)造成的一个无限递归问题分享
Jul 09 Python
用Python的Flask框架结合MySQL写一个内存监控程序
Nov 07 Python
python 开发的三种运行模式详细介绍
Jan 18 Python
python发送邮件脚本
May 22 Python
Python自然语言处理 NLTK 库用法入门教程【经典】
Jun 26 Python
python消除序列的重复值并保持顺序不变的实例
Nov 08 Python
使用pandas读取文件的实现
Jul 31 Python
python3 assert 断言的使用详解 (区别于python2)
Nov 27 Python
python对接ihuyi实现短信验证码发送
May 10 Python
Django 解决由save方法引发的错误
May 21 Python
opencv 图像滤波(均值,方框,高斯,中值)
Jul 08 Python
基于Python-turtle库绘制路飞的草帽骷髅旗、美国队长的盾牌、高达的源码
Feb 18 Python
python else语句在循环中的运用详解
Jul 06 #Python
Keras模型转成tensorflow的.pb操作
Jul 06 #Python
python如何进入交互模式
Jul 06 #Python
python3.4中清屏的处理方法
Jul 06 #Python
Python3基于print打印带颜色字符串
Jul 06 #Python
python判断是空的实例分享
Jul 06 #Python
python三引号如何输入
Jul 06 #Python
You might like
PHP正则获取页面所有图片地址
2016/03/23 PHP
laravel中命名路由的使用方法
2017/02/24 PHP
JavaScript中的其他对象
2008/01/16 Javascript
JavaScript 嵌套函数指向this对象错误的解决方法
2010/03/15 Javascript
深入理解javascript构造函数和原型对象
2014/09/23 Javascript
JS+CSS实现DIV层的展开、收缩效果
2016/01/28 Javascript
下一代Bootstrap的5个特点 超酷炫!
2016/06/17 Javascript
windows 下安装nodejs 环境变量设置
2017/02/02 NodeJs
js实现音乐播放控制条
2017/09/09 Javascript
JavaScript实现学生在线做题计时器功能
2018/12/05 Javascript
es6 symbol的实现方法示例
2019/04/02 Javascript
详解JavaScript的内存空间、赋值和深浅拷贝
2019/04/17 Javascript
详解Vue前端生产环境发布配置实战篇
2019/05/07 Javascript
jquery轮播图插件使用方法详解
2020/07/31 jQuery
python 运算符 供重载参考
2009/06/11 Python
Python def函数的定义、使用及参数传递实现代码
2014/08/10 Python
python使用matplotlib绘图时图例显示问题的解决
2017/04/27 Python
Python入门_浅谈for循环、while循环
2017/05/16 Python
Python的SimpleHTTPServer模块用处及使用方法简介
2018/01/22 Python
python3.4实现邮件发送功能
2018/05/28 Python
Python面向对象之类的封装操作示例
2019/06/08 Python
python操作kafka实践的示例代码
2019/06/19 Python
python连接PostgreSQL过程解析
2020/02/09 Python
python爬虫利器之requests库的用法(超全面的爬取网页案例)
2020/12/17 Python
Daisy London官网:英国最大的首饰集团IBB旗下
2019/02/28 全球购物
美国电子产品购物网站:BuyDig.com
2020/06/17 全球购物
多媒体编辑专业毕业生推荐信
2013/11/05 职场文书
某某同志考察材料
2014/05/28 职场文书
2014年机关工会工作总结
2014/12/19 职场文书
同事打架检讨书
2015/05/06 职场文书
2015年办税服务厅工作总结
2015/07/23 职场文书
2016年清明节期间群众祭祀活动工作总结
2016/04/01 职场文书
创业计划书之牛肉汤快餐店
2019/10/08 职场文书
oracle通过存储过程上传list保存功能
2021/05/12 Oracle
Python实现老照片修复之上色小技巧
2021/10/16 Python
Redis实现一个账号只能登录一个设备
2022/04/19 Redis