解决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函数返回多个值的示例方法
Dec 04 Python
Python 正则表达式(转义问题)
Dec 15 Python
Python MySQLdb Linux下安装笔记
May 09 Python
python实现微信接口(itchat)详细介绍
Oct 23 Python
对python 数据处理中的LabelEncoder 和 OneHotEncoder详解
Jul 11 Python
python多线程并发实例及其优化
Jun 27 Python
Python使用itchat 功能分析微信好友性别和位置
Aug 05 Python
在OpenCV里实现条码区域识别的方法示例
Dec 04 Python
使用Python进行防病毒免杀解析
Dec 13 Python
使用PyTorch实现MNIST手写体识别代码
Jan 18 Python
总结三种用 Python 作为小程序后端的方式
May 02 Python
Python find()、rfind()方法及作用
Dec 24 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笔试题
2009/08/04 PHP
Laravel5.1数据库连接、创建数据库、创建model及创建控制器的方法
2016/03/29 PHP
IE JS编程需注意的内存释放问题
2009/06/23 Javascript
js计算页面刷新的次数
2009/07/20 Javascript
读取input:file的路径并显示本地图片的方法
2013/09/23 Javascript
可插入图片的TEXT文本框
2013/12/27 Javascript
基于jQuery的JavaScript模版引擎JsRender使用指南
2014/12/29 Javascript
JS实现的不规则TAB选项卡效果代码
2015/09/18 Javascript
JS截取字符串实例详解
2015/11/24 Javascript
快速实现jQuery多级菜单效果
2017/02/01 Javascript
JS抛物线动画实例制作
2018/02/24 Javascript
微信小程序+云开发实现欢迎登录注册
2019/05/24 Javascript
原生JavaScript实现弹幕组件的示例代码
2020/10/12 Javascript
[14:00]DOTA2国际邀请赛史上最长大战 赛后专访B神
2013/08/10 DOTA
python有证书的加密解密实现方法
2014/11/19 Python
python文件写入实例分析
2015/04/08 Python
讲解Python中的标识运算符
2015/05/14 Python
Python实现简单过滤文本段的方法
2017/05/24 Python
pycharm下打开、执行并调试scrapy爬虫程序的方法
2017/11/29 Python
Python实现简单文本字符串处理的方法
2018/01/22 Python
python3 读取Excel表格中的数据
2018/10/16 Python
使用python3构建文件传输的方法
2019/02/13 Python
Python使用Pandas库实现MySQL数据库的读写
2019/07/06 Python
python 项目目录结构设置
2020/02/14 Python
浅谈Python中的继承
2020/06/19 Python
python使用yaml 管理selenium元素的示例
2020/12/01 Python
五好党支部事迹材料
2014/02/06 职场文书
我们的节日端午节活动方案
2014/03/02 职场文书
婚纱摄影师求职信
2014/03/07 职场文书
《长相思》听课反思
2014/04/10 职场文书
文案策划专业自荐信
2014/07/07 职场文书
班组长安全工作职责
2014/07/15 职场文书
2015年惩防体系建设工作总结
2015/05/22 职场文书
无故旷工检讨书
2015/08/15 职场文书
导游词之海南天涯海角
2019/12/05 职场文书
JPA 通过Specification如何实现复杂查询
2021/11/23 Java/Android