解决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对象体系深入分析
Oct 28 Python
Python跨文件全局变量的实现方法示例
Dec 10 Python
Python3最长回文子串算法示例
Mar 04 Python
Windows 安装 Anaconda3+PyCharm的方法步骤
Jun 13 Python
python nmap实现端口扫描器教程
May 28 Python
python tkinter图形界面代码统计工具
Sep 18 Python
python 字典有序并写入json文件过程解析
Sep 30 Python
给Python学习者的文件读写指南(含基础与进阶)
Jan 29 Python
解决pyinstaller 打包exe文件太大,用pipenv 缩小exe的问题
Jul 13 Python
Python本地及虚拟解释器配置过程解析
Oct 13 Python
pyqt5打包成exe可执行文件的方法
May 14 Python
移除Selenium中window.navigator.webdriver值
Jun 10 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分页实例代码分享
2011/07/28 PHP
浅谈PHP中的
2016/04/23 PHP
firefox下frameset取不到值的解决方法
2010/09/06 Javascript
地址栏传递中文参数乱码在js里用escape转码
2013/08/28 Javascript
div+css+js实现无缝滚动类似marquee无缝滚动兼容firefox
2013/08/29 Javascript
js获取url中指定参数值的示例代码
2013/12/14 Javascript
jquery实现checkbox全选全不选的简单实例
2013/12/31 Javascript
什么是MEAN?JavaScript编程中的MEAN是什么意思?
2014/12/18 Javascript
javascript中函数作为参数调用的方法
2015/02/09 Javascript
JavaScript删除数组元素的方法
2015/03/20 Javascript
javascript之Array 数组对象详解
2016/06/07 Javascript
jQuery制作网页版选项卡
2016/07/28 Javascript
JavaScript九九乘法口诀表的简单实现
2016/10/04 Javascript
微信小程序 swiper组件轮播图详解及实例
2016/11/16 Javascript
基于vue开发的在线付费课程应用过程
2018/01/25 Javascript
开发Node CLI构建微信小程序脚手架的示例
2020/03/27 Javascript
vue路由的配置和页面切换详解
2020/09/09 Javascript
python中 ? : 三元表达式的使用介绍
2013/10/09 Python
Python爬豆瓣电影实例
2018/02/23 Python
Python QQBot库的QQ聊天机器人
2019/06/19 Python
Python requests模块基础使用方法实例及高级应用(自动登陆,抓取网页源码)实例详解
2020/02/14 Python
Python Tkinter实例——模拟掷骰子
2020/10/24 Python
CSS3之transition实现下划线的示例代码
2018/05/30 HTML / CSS
Champion官网:美国冠军运动服装
2017/01/25 全球购物
英国著名的小众美容品牌网站:Alyaka
2017/08/08 全球购物
Python的两道面试题
2013/06/29 面试题
自考毕业生自我鉴定
2013/11/04 职场文书
新文化运动的口号
2014/06/21 职场文书
群众路线教育实践活动对照检查材料
2014/09/22 职场文书
重阳节标语大全
2014/10/07 职场文书
事业单位聘任报告
2015/03/02 职场文书
2015年采购员工作总结
2015/04/27 职场文书
2016年公共机构节能宣传周活动总结
2016/04/05 职场文书
祝福语集锦:给百岁老人祝寿贺词
2019/11/19 职场文书
Ajax常用封装库——Axios的使用
2021/05/08 Javascript
vue3种table表格选项个数的控制方法
2022/04/14 Vue.js