解决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之编写类之二方法
Oct 11 Python
使用Python中的cookielib模拟登录网站
Apr 09 Python
Python中属性和描述符的正确使用
Aug 23 Python
100行python代码实现跳一跳辅助程序
Jan 15 Python
Python matplotlib 画图窗口显示到gui或者控制台的实例
May 24 Python
Pycharm 创建 Django admin 用户名和密码的实例
May 30 Python
python使用PIL给图片添加文字生成海报示例
Aug 17 Python
python3+requests接口自动化session操作方法
Oct 13 Python
django drf框架中的user验证以及JWT拓展的介绍
Aug 12 Python
Python3自动生成MySQL数据字典的markdown文本的实现
May 07 Python
使用Python实现微信拍一拍功能的思路代码
Jul 09 Python
Python hashlib模块的使用示例
Oct 09 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数组函数array_merge(必看篇)
2017/05/25 PHP
laravel 5.1下php artisan migrate的使用注意事项总结
2017/06/07 PHP
IOS 开发之NSDictionary转换成JSON字符串
2017/08/14 PHP
PHP从零开始打造自己的MVC框架之入口文件实现方法详解
2019/06/03 PHP
php设计模式之策略模式应用案例详解
2019/06/17 PHP
javascript跨浏览器的属性判断方法
2014/03/16 Javascript
js设置控件的隐藏与显示的两种方法
2014/08/21 Javascript
分享网页检测摇一摇实例代码
2016/01/14 Javascript
javascript高级选择器querySelector和querySelectorAll全面解析
2016/04/07 Javascript
jQuery Mobile操作HTML5的常用函数总结
2016/05/17 Javascript
jQuery实现的无限级下拉菜单功能示例
2016/09/12 Javascript
Angular.Js的自动化测试详解
2016/12/09 Javascript
js事件委托和事件代理案例分享
2017/07/25 Javascript
vue 中使用 watch 出现了如下的报错的原因分析
2019/05/21 Javascript
vue element 生成无线级左侧菜单的实现代码
2019/08/21 Javascript
微信小程序背景音乐开发详解
2019/12/12 Javascript
vue实现购物车案例
2020/05/30 Javascript
原生js生成图片验证码
2020/10/11 Javascript
[01:27]DOTA2电竞之夜 今夜共饮庆功酒
2014/08/02 DOTA
解析Python中的二进制位运算符
2015/05/13 Python
python实现音乐下载的统计
2018/06/20 Python
python3中os.path模块下常用的用法总结【推荐】
2018/09/16 Python
使用PM2+nginx部署python项目的方法示例
2018/11/07 Python
pyqt5 实现工具栏文字图片同时显示
2019/06/13 Python
对django中foreignkey的简单使用详解
2019/07/28 Python
python数据库编程 ODBC方式实现通讯录
2020/03/27 Python
python代码实现将列表中重复元素之间的内容全部滤除
2020/05/22 Python
如何在Python3中使用telnetlib模块连接网络设备
2020/09/21 Python
HTML5标签小集
2011/08/02 HTML / CSS
大专生自荐信
2013/10/04 职场文书
《桂花雨》教学反思
2014/04/12 职场文书
先进事迹材料范文
2014/12/29 职场文书
搞笑结婚保证书
2015/05/08 职场文书
Python实现天气查询软件
2021/06/07 Python
CSS实现九宫格布局(自适应)的示例代码
2022/02/12 HTML / CSS
Python+OpenCV实现在图像上绘制矩形
2022/03/21 Python