解决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连接mysql数据库示例(做增删改操作)
Dec 31 Python
Python中关键字global和nonlocal的区别详解
Sep 03 Python
Python 加密与解密小结
Dec 06 Python
python 去除二维数组/二维列表中的重复行方法
Jan 23 Python
python设置环境变量的原因和方法
Jun 24 Python
python pandas获取csv指定行 列的操作方法
Jul 12 Python
简单的Python调度器Schedule详解
Aug 30 Python
Python2与Python3的区别点整理
Dec 12 Python
python多进程重复加载的解决方式
Dec 13 Python
python各种excel写入方式的速度对比
Nov 10 Python
Python机器学习算法之决策树算法的实现与优缺点
May 13 Python
python中pd.cut()与pd.qcut()的对比及示例
Jun 16 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
一个多文件上传的例子(原创)
2006/10/09 PHP
PHP number_format() 函数定义和用法
2012/06/01 PHP
PHP防止刷新重复提交页面的示例代码
2015/11/11 PHP
针对thinkPHP5框架存储过程bug重写的存储过程扩展类完整实例
2018/06/16 PHP
asp批量修改记录的代码
2008/06/25 Javascript
jquery 使用简明教程
2014/03/05 Javascript
jQuery实现字符串按指定长度加入特定内容的方法
2015/03/11 Javascript
JavaScript Ajax编程 应用篇
2016/07/02 Javascript
jquery 键盘事件的使用方法详解
2017/09/13 jQuery
js中的 || 与 && 运算符详解
2018/05/24 Javascript
vue 使某个组件不被 keep-alive 缓存的方法
2018/09/21 Javascript
解决iview多表头动态更改列元素发生的错误的方法
2018/11/02 Javascript
如何检查一个对象是否为空
2019/04/11 Javascript
Vue编写可显示周和月模式的日历 Vue自定义日历内容的显示
2019/06/26 Javascript
[11:44]Ti9 OG夺冠时刻
2019/08/25 DOTA
python 查找文件夹下所有文件 实现代码
2009/07/01 Python
Python中使用异常处理来判断运行的操作系统平台方法
2015/01/22 Python
python 获取当天每个准点时间戳的实例
2018/05/22 Python
Python传递参数的多种方式(小结)
2019/09/18 Python
python用Configobj模块读取配置文件
2020/09/26 Python
Roxy美国官网:澳大利亚冲浪、滑雪健身品牌
2016/07/30 全球购物
巴西男士个人护理产品商店:SHOP4MEN
2017/08/07 全球购物
标签和贴纸印刷:Lightning Labels
2018/03/22 全球购物
eBay爱尔兰站:eBay.ie
2019/08/09 全球购物
网络方面基础面试题
2012/11/16 面试题
个人求职简历的自我评价
2013/10/19 职场文书
自我评价个人范文
2013/12/16 职场文书
总经理秘书工作职责
2013/12/26 职场文书
《梅兰芳学艺》教学反思
2014/02/24 职场文书
广告宣传策划方案
2014/05/21 职场文书
学校党风廉政建设调研报告
2015/01/01 职场文书
老公婚前保证书
2015/02/28 职场文书
新郎接新娘保证书
2015/05/08 职场文书
开业典礼致辞
2015/07/29 职场文书
小学班级管理心得体会
2016/01/07 职场文书
MySQL的prepare使用以及遇到的bug
2022/05/11 MySQL