解决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的subprocess模块总结
Nov 07 Python
Python Web框架Flask信号机制(signals)介绍
Jan 01 Python
Python性能优化技巧
Mar 09 Python
Python设计模式编程中解释器模式的简单程序示例分享
Mar 02 Python
Python利用公共键如何对字典列表进行排序详解
May 19 Python
Python中pandas模块DataFrame创建方法示例
Jun 20 Python
python自定义线程池控制线程数量的示例
Feb 22 Python
python SocketServer源码深入解读
Sep 17 Python
Python 线程池用法简单示例
Oct 02 Python
pycharm全局搜索的具体步骤
Jul 28 Python
python更新数据库中某个字段的数据(方法详解)
Nov 18 Python
Python FuzzyWuzzy实现模糊匹配
Apr 28 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
YII Framework框架教程之缓存用法详解
2016/03/14 PHP
比较完整的微信开发php代码
2016/08/02 PHP
PHP7标量类型declare用法实例分析
2016/09/26 PHP
PHP带节点操作的无限分类实现方法详解
2016/11/09 PHP
CakePHP框架Model函数定义方法示例
2017/08/04 PHP
php提供实现反射的方法和实例代码
2019/09/17 PHP
PHP设计模式之迭代器模式Iterator实例分析【对象行为型】
2020/04/26 PHP
IE的有条件注释判定IE版本详解(附实例代码)
2012/01/04 Javascript
Javascript中this的用法详解
2014/09/22 Javascript
基于jQuery实现下拉框
2014/11/24 Javascript
实现音乐播放器的代码(html5+css3+jquery)
2015/08/04 Javascript
谈谈对offsetleft兼容性的理解
2015/11/11 Javascript
jQuery弹簧插件编写基础之“又见弹窗”
2015/12/11 Javascript
JS简单生成随机数(随机密码)的方法
2017/05/11 Javascript
nodejs npm错误Error:UNKNOWN:unknown error,mkdir 'D:\Develop\nodejs\node_global'at Error
2019/03/02 NodeJs
小程序server请求微信服务器超时的解决方法
2019/05/21 Javascript
javascript中的this作用域详解
2019/07/15 Javascript
深入浅析Vue中mixin和extend的区别和使用场景
2019/08/01 Javascript
js实现星星打分效果
2020/07/05 Javascript
vue 解决IOS10低版本白屏的问题
2020/11/17 Javascript
Python中的zip函数使用示例
2015/01/29 Python
python3 发送任意文件邮件的实例
2018/01/23 Python
对python3 中方法各种参数和返回值详解
2018/12/15 Python
python 实现让字典的value 成为列表
2019/12/16 Python
详解Ubuntu环境下部署Django+uwsgi+nginx总结
2020/04/02 Python
tensorflow模型的save与restore,及checkpoint中读取变量方式
2020/05/26 Python
如何基于Django实现上下文章跳转
2020/09/16 Python
CSS3实现可爱的小黄人动画
2016/07/11 HTML / CSS
学生出入校管理制度
2014/01/16 职场文书
毕业生自我鉴定实例
2014/01/21 职场文书
大学军训感言1500字
2014/03/09 职场文书
2015年爱牙日活动总结
2015/02/05 职场文书
2015年护士节活动总结
2015/02/10 职场文书
2015年秋季灭鼠工作总结
2015/07/27 职场文书
网吧员工管理制度
2015/08/05 职场文书
服务器nginx权限被拒绝解决案例
2022/09/23 Servers