解决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 19 Python
浅述python中argsort()函数的实例用法
Mar 30 Python
Python爬取当当、京东、亚马逊图书信息代码实例
Dec 09 Python
Python获取当前公网ip并自动断开宽带连接实例代码
Jan 12 Python
python 定时器,实现每天凌晨3点执行的方法
Feb 20 Python
python识别图像并提取文字的实现方法
Jun 28 Python
Pandas实现DataFrame按行求百分数(比例数)
Dec 27 Python
关于python 的legend图例,参数使用说明
Apr 17 Python
pycharm 2018 激活码及破解补丁激活方式
Sep 21 Python
Django实现内容缓存实例方法
Jun 30 Python
DRF框架API版本管理实现方法解析
Aug 21 Python
Python中的min及返回最小值索引的操作
May 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执行速率优化技巧小结
2008/03/15 PHP
PHP下利用header()函数设置浏览器缓存的代码
2010/09/01 PHP
yii去掉必填项中星号的方法
2015/12/28 PHP
原生php实现excel文件读写的方法分析
2018/04/25 PHP
基于jquery的15款幻灯片插件
2011/04/10 Javascript
JS中typeof与instanceof之间的区别总结
2013/11/14 Javascript
js中Math之random,round,ceil,floor的用法总结
2013/12/26 Javascript
jQuery中的jQuery()方法用法分析
2014/12/27 Javascript
js过滤HTML标签完整实例
2015/11/26 Javascript
jQuery中弹出iframe内嵌页面元素到父页面并全屏化的实例代码
2016/12/27 Javascript
JavaScript基于replace+正则实现ES6的字符串模版功能
2017/04/25 Javascript
JS基于正则表达式实现的密码强度验证功能示例
2017/09/21 Javascript
详解json串反转义(消除反斜杠)
2019/08/12 Javascript
JS document内容及样式操作完整示例
2020/01/14 Javascript
vue + el-form 实现的多层循环表单验证
2020/11/25 Vue.js
一个简单的python程序实例(通讯录)
2013/11/29 Python
使用Python编写一个模仿CPU工作的程序
2015/04/16 Python
解读Python编程中的命名空间与作用域
2015/10/16 Python
python中将\\uxxxx转换为Unicode字符串的方法
2018/09/06 Python
python 实现语音聊天机器人的示例代码
2018/12/02 Python
Python中collections模块的基本使用教程
2018/12/07 Python
浅谈python中真正关闭socket的方法
2018/12/18 Python
解决python ogr shp字段写入中文乱码的问题
2018/12/31 Python
Python GUI自动化实现绕过验证码登录
2020/01/10 Python
Django实现文章详情页面跳转代码实例
2020/09/16 Python
英国骑行、跑步、游泳、铁人三项运动装备专卖店:Wiggle
2016/08/23 全球购物
绘儿乐产品官方在线商店:Crayola.com
2019/09/07 全球购物
阿迪达斯香港官网:adidas香港
2019/11/09 全球购物
XML文档面试题
2015/08/05 面试题
护理专业自我鉴定
2014/01/30 职场文书
财产公证书
2014/04/10 职场文书
医疗纠纷协议书
2014/04/16 职场文书
应急管理培训方案
2014/06/12 职场文书
贪污检举信范文
2015/03/02 职场文书
学校工会工作总结2015
2015/05/19 职场文书
科学家测试在太空中培育人造肉,用于未来太空旅行
2022/04/29 数码科技