解决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每次处理固定个数的字符的方法总结
Jan 29 Python
Python排序搜索基本算法之插入排序实例分析
Dec 11 Python
Django实现全文检索的方法(支持中文)
May 14 Python
Python实现自定义函数的5种常见形式分析
Jun 16 Python
Python实用技巧之列表、字典、集合中根据条件筛选数据详解
Jul 11 Python
Django 自动生成api接口文档教程
Nov 19 Python
python查找特定名称文件并按序号、文件名分行打印输出的方法
Apr 24 Python
PyCharm中如何直接使用Anaconda已安装的库
May 28 Python
Python使用Chrome插件实现爬虫过程图解
Jun 09 Python
Python 执行矩阵与线性代数运算
Aug 01 Python
python进行二次方程式计算的实例讲解
Dec 06 Python
解决tensorflow模型压缩的问题_踩坑无数,总算搞定
Mar 02 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实现的随机广告显示代码
2007/06/14 PHP
php实现cookie加密的方法
2015/03/10 PHP
php如何计算两坐标点之间的距离
2018/12/29 PHP
JavaScript 变量命名规则
2009/09/23 Javascript
Jquery+JSon 无刷新分页实现代码
2010/04/01 Javascript
关于JavaScript的with 语句的使用方法
2011/05/09 Javascript
Javascript insertAfter() 实现函数代码
2011/10/12 Javascript
多个js与css文件的合并方法详细说明
2012/12/26 Javascript
JavaScript中对象property的删除方法介绍
2014/12/30 Javascript
jquery实现九宫格大转盘抽奖
2015/11/13 Javascript
百度搜索框智能提示案例jsonp
2016/11/28 Javascript
setTimeout函数的神奇使用
2017/02/26 Javascript
Vue中保存用户登录状态实例代码
2017/06/07 Javascript
Bootstrap Table使用整理(一)
2017/06/09 Javascript
解决vue中无法动态修改jqgrid组件 url地址的问题
2018/03/01 Javascript
函数式编程入门实践(一)
2019/04/20 Javascript
小程序怎样让wx.navigateBack更好用的方法实现
2019/11/01 Javascript
vuejs中父子组件之间通信方法实例详解
2020/01/17 Javascript
[02:55]DOTA2英雄基础教程 发条技师
2013/12/04 DOTA
wxpython中利用线程防止假死的实现方法
2014/08/11 Python
轻松理解Python 中的 descriptor
2017/09/15 Python
python将字符串list写入excel和txt的实例
2019/07/20 Python
win10系统Anaconda和Pycharm的Tensorflow2.0之CPU和GPU版本安装教程
2019/12/03 Python
Python @property装饰器原理解析
2020/01/22 Python
利用Bootstrap实现漂亮简洁的CSS3价格表实例源码
2017/03/02 HTML / CSS
最畅销的视频游戏享受高达90%的折扣:CDKeys
2020/02/10 全球购物
电信营业员自我评价分享
2014/01/17 职场文书
公司活动方案范文
2014/03/06 职场文书
建筑节能汇报材料
2014/08/22 职场文书
实习协议书范本
2014/09/25 职场文书
靠谱准确的求职信
2019/04/02 职场文书
阿里云服务器搭建Php+Apache运行环境的详细过程
2021/05/15 PHP
js Proxy的原理详解
2021/05/25 Javascript
SQL Server作业失败:无法确定所有者是否有服务器访问权限的解决方法
2021/06/30 SQL Server
解析redis hash应用场景和常用命令
2021/08/04 Redis
Tomcat弱口令复现及利用
2022/05/06 Servers