解决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 开发Activex组件方法
Nov 08 Python
基于python中staticmethod和classmethod的区别(详解)
Oct 24 Python
python机器学习之决策树分类详解
Dec 20 Python
Python编程把二叉树打印成多行代码
Jan 04 Python
利用python循环创建多个文件的方法
Oct 25 Python
pygame游戏之旅 添加游戏暂停功能
Nov 21 Python
python+pyqt5实现KFC点餐收银系统
Jan 24 Python
python编写简单端口扫描器
Sep 04 Python
Python numpy线性代数用法实例解析
Nov 15 Python
详解pytorch tensor和ndarray转换相关总结
Sep 03 Python
使用Python下载抖音各大V视频的思路详解
Feb 06 Python
python实现不同数据库间数据同步功能
Feb 25 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中根据变量的类型 选择echo或dump
2012/07/05 PHP
ThinkPHP验证码和分页实例教程
2014/08/22 PHP
PHP程序中的文件锁、互斥锁、读写锁使用技巧解析
2016/03/21 PHP
php lcg_value与mt_rand生成0~1随机小数的效果对比分析
2017/04/05 PHP
php获取微信基础接口凭证Access_token
2018/08/23 PHP
jquery中的$(document).ready()与window.onload的区别
2009/11/18 Javascript
jQuery的12招常用技巧分享
2011/08/08 Javascript
js 关于=+与+=日期函数使用说明(赋值运算符)
2011/11/15 Javascript
js实现杯子倒水问题自动求解程序
2013/03/25 Javascript
node.js中的buffer.slice方法使用说明
2014/12/10 Javascript
JS实现控制表格行文本对齐的方法
2015/03/30 Javascript
JQUERY的AJAX请求缓存里的数据问题处理
2016/02/23 Javascript
详解微信小程序开发—你期待的分享功能来了,微信小程序序新增5大功能
2016/12/23 Javascript
AngularJS使用ocLazyLoad实现js延迟加载
2017/07/05 Javascript
微信小程序分页加载的实例代码
2017/07/11 Javascript
vue项目中使用百度地图的方法
2018/06/08 Javascript
Angular PWA使用的Demo示例
2019/01/31 Javascript
微信小程序实现定位及到指定位置导航的示例代码
2019/08/20 Javascript
JavaScript实现抖音罗盘时钟
2019/10/11 Javascript
vue-cli+iview项目打包上线之后图标不显示问题及解决方法
2019/10/16 Javascript
js实现验证码干扰(动态)
2021/02/23 Javascript
Python完全新手教程
2007/02/08 Python
Python 基础教程之闭包的使用方法
2017/09/29 Python
Python实现利用163邮箱远程关电脑脚本
2018/02/22 Python
Python简单实现网页内容抓取功能示例
2018/06/07 Python
Python下简易的单例模式详解
2019/04/08 Python
python挖矿算力测试程序详解
2019/07/03 Python
python_mask_array的用法
2020/02/18 Python
HTML5 Canvas阴影使用方法实例演示
2013/08/02 HTML / CSS
全球速卖通西班牙站:AliExpress西班牙
2017/10/30 全球购物
新西兰购物网站:TheMarket NZ
2020/09/19 全球购物
环保倡议书格式范文
2014/05/14 职场文书
质量月口号
2014/06/20 职场文书
2014年小学教师工作自我评价
2014/09/22 职场文书
2014年公务员转正工作总结
2014/11/07 职场文书
golang 实现并发求和
2021/05/08 Golang