解决TensorFlow调用Keras库函数存在的问题
作者:audiobuffer 发布时间:2023-11-20 15:04:25
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
波形是断断续续的。而且最后不收敛。
运行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的正确打开方式啊~):
再回头看之前写的调用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
来源:https://blog.csdn.net/u012222949/article/details/80917921


猜你喜欢
- 目录1.字典字典的相关操作获取字典的长度2.集合1.字典字典是python中的一种数据结构。它的内容由**键-值(key-value)**的
- pymysql 模块!pymysql模块时一个第三方模块!需要下载:pymysql的基本使用:import pymysqlconn = py
- 一、简介此模块用于简化paramiko与网络设备之间的ssh连接,可在windows与Unix平台使用 二、目前支持的设备(201
- 1、什么是归一化:归一化就是把一组数(大于1)化为以1为最大值,0为最小值,其余数据按百分比计算的方法。如:1,2,3.,那归一化后就是:0
- 生成静态页的页面非常的简单就是定义好模板与模板标题,之后利用str_replace进行替换了,是最常用的方法,另一种是利用ob_get_co
- 钉钉开放平台传送门:https://open.dingtalk.com我司使用钉钉作为内部通讯工具,基本上大家在电脑和手机上都开着,消息可以
- golang学习第一波,使用http get请求高德天气接口。一、准备内容:1、注册高德开发者账号,申请key 2、golang开发工具Li
- 在web页面中,图片居左,内容居右排列,是非常常见的效果,它也就是媒体对象,它是一种抽象的样式,可以用来构建不同类型的组件,在bootstr
- 闭包(closure)是函数式编程的重要的语法结构。函数式编程是一种编程范式 (而面向过程编程和面向对象编程也都是编程范式)。在面向过程编程
- 前几天玩了玩Google的Map API,感觉还不错,很简单。但凡有过任何编程经验的同学,看完以下的教程,都可以在10分钟内掌握它的主要功能
- 前言之前有人提了一个需求,我一看此需求用正则表达式最合适不过。考虑到之前每次使用正则表达式,都是临时抱佛脚,于是这次我就一边完成任务一边系统
- 大家好,今天分享一个非常有趣的 Python 教程,如何美化一个 matplotlib 折线图,喜欢记得收藏、关注、点赞。1. 导入包imp
- 这次做一个比较贴近我实际的东西:python分析作业提交情况。要求: 将服务器中交作业的学生(
- 高阶函数简介高阶函数 的英文名叫 Higher-Order Function ,是 函数式编程 中的一种。他的表现形式往往是通过把函数作为参
- Broadcast广播是numpy对不同形状(shape)的数组进行数值计算的方式,对数组的算术运算通常在相应的元素上进行。如果两个数组a和
- 定义直接赋值:就是对象的引用(别名)浅拷贝(copy):拷贝父对象,不拷贝对象内部的子对象深拷贝(deepcopy):copy模块的deep
- Oracle 背景资料 在介绍 Oracle9i 之前我们先介绍一些关于Oracle 公司的资料,让各位朋友更多了解 Oracle。 197
- 流动网页设计有很多好处,但也只有在正确使用的时候。合适的技巧会使页面在大屏幕、小屏幕抑、PDA小屏幕上都能得到良好的呈现。但是,糟糕的代码结
- 错误代码如下:NotFoundError (see above for traceback): Unsuccessful TensorSli
- 话不多说,请看代码:<?phpdate_default_timezone_set("PRC"); error_re