解决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中元祖、列表和字典的区别
Aug 17 Python
Python多维/嵌套字典数据无限遍历的实现
Nov 04 Python
python中import学习备忘笔记
Jan 24 Python
python基本语法练习实例
Sep 19 Python
Django使用Mysql数据库已经存在的数据表方法
May 27 Python
在Python中居然可以定义两个同名通参数的函数
Jan 31 Python
Python虚拟环境的原理及使用详解
Jul 02 Python
python3实现绘制二维点图
Dec 04 Python
django haystack实现全文检索的示例代码
Jun 24 Python
获取CSDN文章内容并转换为markdown文本的python
Sep 06 Python
pycharm 多行批量缩进和反向缩进快捷键介绍
Jan 15 Python
python模块内置属性概念及实例
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
memcached 和 mysql 主从环境下php开发代码详解
2010/05/16 PHP
Docker 安装 PHP并与Nginx的部署实例讲解
2021/02/27 PHP
使用javascript访问XML数据的实例
2006/12/27 Javascript
在JavaScript中通过URL传递汉字的方法
2007/04/09 Javascript
GreyBox技术总结(转)
2010/11/23 Javascript
jQuery 常见操作实现方式和常用函数方法总结
2011/05/06 Javascript
jquery分页插件AmSetPager(自写)
2013/04/15 Javascript
js输出阴历、阳历、年份、月份、周示例代码
2014/01/29 Javascript
AngularJS入门教程之服务(Service)
2016/07/27 Javascript
JQuery获取鼠标进入和离开容器的方向
2016/12/29 Javascript
详解Javascript中DOM的范围
2017/02/13 Javascript
微信小程序 数据遍历的实现
2017/04/05 Javascript
AngularJS 霸道的过滤器小结
2017/04/26 Javascript
vue中七牛插件使用的实例代码
2017/07/28 Javascript
微信小程序图片选择区域裁剪实现方法
2017/12/02 Javascript
vue单个组件实现无限层级多选菜单功能
2018/04/10 Javascript
webstorm中vue语法的支持详解
2018/05/09 Javascript
JS构造一个html文本内容成文件流形式发送到后台
2018/07/31 Javascript
angular6 填坑之sdk的方法
2018/12/27 Javascript
微信小程序实现按字母排列选择城市功能
2019/11/25 Javascript
vue keep-alive的简单总结
2021/01/25 Vue.js
从零学python系列之教你如何根据图片生成字符画
2014/05/23 Python
Python中MYSQLdb出现乱码的解决方法
2014/10/11 Python
Python中zfill()方法的使用教程
2015/05/20 Python
Python实用技巧之利用元组代替字典并为元组元素命名
2018/07/11 Python
Python3+Pycharm+PyQt5环境搭建步骤图文详解
2019/05/29 Python
Pandas_cum累积计算和rolling滚动计算的用法详解
2019/07/04 Python
python 3.74 运行import numpy as np 报错lib\site-packages\numpy\__init__.py
2019/10/06 Python
django框架auth模块用法实例详解
2019/12/10 Python
PyCharm vs VSCode,作为python开发者,你更倾向哪种IDE呢?
2020/08/17 Python
我的梦中国梦演讲稿
2014/04/23 职场文书
2016高考感言
2015/08/01 职场文书
导游带团欢迎词
2015/09/30 职场文书
2016年大学生党员公开承诺书
2016/03/24 职场文书
2019暑假阅读倡议书
2019/06/24 职场文书
JDK8中String的intern()方法实例详细解读
2022/09/23 Java/Android