解决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之入门(四)运算
May 27 Python
9种python web 程序的部署方式小结
Jun 30 Python
Python Web框架Flask中使用七牛云存储实例
Feb 08 Python
Python下使用Scrapy爬取网页内容的实例
May 21 Python
python用列表生成式写嵌套循环的方法
Nov 08 Python
Flask核心机制之上下文源码剖析
Dec 25 Python
Python3使用Matplotlib 绘制精美的数学函数图形
Apr 11 Python
Python学习笔记之函数的定义和作用域实例详解
Aug 13 Python
python 利用turtle库绘制笑脸和哭脸的例子
Nov 23 Python
Python: 传递列表副本方式
Dec 19 Python
python 实现"神经衰弱"翻牌游戏
Nov 09 Python
Python从文件中读取数据的方法步骤
Nov 18 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
Fleaphp常见函数功能与用法示例
2016/11/15 PHP
Javascript 自适应高度的Tab选项卡
2011/04/05 Javascript
NodeJS的模块写法入门(实例代码)
2012/03/07 NodeJs
JQuery点击事件回到页面顶部效果的实现代码
2016/05/24 Javascript
对js中回调函数的一些看法
2016/08/29 Javascript
JavaScript仿支付宝6位数字密码输入框
2016/12/29 Javascript
Vuex和前端缓存的整合策略详解
2017/05/09 Javascript
vue.js 获取当前自定义属性值
2017/06/01 Javascript
JavaScript变量类型以及变量作用域详解
2017/08/14 Javascript
AngularJS集合数据遍历显示的实例
2017/12/27 Javascript
Vue2.0点击切换类名改变样式的方法
2018/08/22 Javascript
Node.js 使用request模块下载文件的实例
2018/09/05 Javascript
React+Antd+Redux实现待办事件的方法
2019/03/14 Javascript
解决vue.js提交数组时出现数组下标的问题
2019/11/05 Javascript
详谈vue中router-link和传统a链接的区别
2020/07/22 Javascript
Javascript中Math.max和Math.max.apply的区别和用法详解
2020/08/24 Javascript
vant 中van-list的用法说明
2020/11/11 Javascript
小程序实现密码输入框
2020/11/16 Javascript
vue 递归组件的简单使用示例
2021/01/14 Vue.js
[56:56]VG vs LGD 2019国际邀请赛淘汰赛 胜者组 BO3 第一场 8.22
2019/09/05 DOTA
Python导入txt数据到mysql的方法
2015/04/08 Python
Python设计足球联赛赛程表程序的思路与简单实现示例
2016/06/28 Python
解决pycharm 远程调试 上传 helpers 卡住的问题
2019/06/27 Python
Python爬虫 scrapy框架爬取某招聘网存入mongodb解析
2019/07/31 Python
tensor和numpy的互相转换的实现示例
2019/08/02 Python
Python.append()与Python.expand()用法详解
2019/12/18 Python
使用Python爬虫库requests发送表单数据和JSON数据
2020/01/25 Python
使用Bazel编译TensorBoard教程
2020/02/15 Python
pandas分组聚合详解
2020/04/10 Python
matplotlib之pyplot模块之标题(title()和suptitle())
2021/02/22 Python
马德里竞技官方网上商店:Atletico Madrid Shop
2019/03/31 全球购物
会计专业求职信
2014/08/10 职场文书
先进个人自荐书
2015/03/06 职场文书
熟背这些句子,让您的英语口语突飞猛进(135句)
2019/09/06 职场文书
Django操作cookie的实现
2021/05/26 Python
OpenCV中resize函数插值算法的实现过程(五种)
2021/06/05 Python