解决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处理圆角图片、圆形图片的例子
Apr 25 Python
django表单实现下拉框的示例讲解
May 29 Python
python2.7使用plotly绘制本地散点图和折线图
Apr 02 Python
Python3.5面向对象程序设计之类的继承和多态详解
Apr 24 Python
Python paramiko模块使用解析(实现ssh)
Aug 30 Python
np.newaxis 实现为 numpy.ndarray(多维数组)增加一个轴
Nov 30 Python
python shapely.geometry.polygon任意两个四边形的IOU计算实例
Apr 12 Python
Python如何把十进制数转换成ip地址
May 25 Python
基于keras中的回调函数用法说明
Jun 17 Python
Python Tkinter实例——模拟掷骰子
Oct 24 Python
matplotlib实现数据实时刷新的示例代码
Jan 05 Python
opencv实现图像平移效果
Mar 24 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数字游戏 计算24算法
2012/06/10 PHP
php rsa 加密,解密,签名,验签详解
2016/12/06 PHP
PHP获取文本框、密码域、按钮的值实例代码
2017/04/19 PHP
php桥接模式应用案例分析
2019/10/23 PHP
解读IE和firefox下JScript和HREF的执行顺序
2008/01/12 Javascript
extjs 列表框(multiselect)的动态添加列表项的方法
2009/07/31 Javascript
javascript 文本框水印/占位符(watermark/placeholder)实现方法
2012/01/15 Javascript
js动态设置鼠标事件示例代码
2013/10/30 Javascript
node.js入门教程迷你书、node.js入门web应用开发完全示例
2014/04/06 Javascript
javascript实现禁止鼠标滚轮事件
2015/07/24 Javascript
谈谈JavaScript异步函数发展历程
2015/09/29 Javascript
跟我学习javascript的隐式强制转换
2015/11/16 Javascript
Angular.JS判断复选框checkbox是否选中并实时显示
2016/11/30 Javascript
js倒计时显示实例
2016/12/11 Javascript
利用Javascript裁剪图片并存储的简单实现
2017/03/13 Javascript
JS简单判断滚动条的滚动方向实现方法
2017/04/28 Javascript
nodejs中sleep功能实现暂停几秒的方法
2017/07/12 NodeJs
Vue filter介绍及其使用详解
2017/10/21 Javascript
JS实现的input选择图片本地预览功能示例
2018/08/29 Javascript
React注册倒计时功能的实现
2018/09/06 Javascript
如何实现一个webpack模块解析器
2018/10/24 Javascript
在Vant的基础上实现添加表单验证框架的方法示例
2018/12/05 Javascript
微信小程序时间轴实现方法示例
2019/01/14 Javascript
详解如何使用webpack打包多页jquery项目
2019/02/01 jQuery
vue+echarts实现动态折线图的方法与注意
2020/09/01 Javascript
Vuejs通过拖动改变元素宽度实现自适应
2020/09/02 Javascript
Python变量和字符串详解
2017/04/29 Python
Python numpy.zero() 初始化矩阵实例
2019/11/27 Python
python返回数组的索引实例
2019/11/28 Python
python 类之间的参数传递方式
2019/12/20 Python
python如何变换环境
2020/07/21 Python
python如何遍历指定路径下所有文件(按按照时间区间检索)
2020/09/14 Python
银行批评与自我批评
2014/02/10 职场文书
优秀教师个人总结
2015/02/11 职场文书
2019年怎样才能撰写出优秀的自荐信
2019/03/25 职场文书
SQL之各种join小结详细讲解
2021/08/04 MySQL