解决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
猜你喜欢
- 窗口的透视变换效果 当我们点击Win10的UWP应用中的小部件时,会发现小部件会朝着鼠标点击位置凹陷下去,而且不同的点击位置对应着不同的
- endswith()方法返回true,如果字符串以指定后缀结尾,否则返回(False可选限制的匹配从给定的索引开始和结束)。语法
- 对于什么是好设计,一万个人那里至少有一万零一个答案。每个人都有自己的答案,有的人还不止一个答案。老师说,一定要在设计里灌注自己的思想,有了自
- Numba是Python的即时编译器,在使用NumPy数组和函数以及循环的代码上效果最佳。使用Numba的最常见方法是通过其装饰器集合,这些
- 首先,必须有错误继续进行的声明On Error Resume Next 然后尝试简历jmail实例: Dim JMail Set JMail
- Python 定义了类型转换函数以将一种数据类型直接转换为另一种数据类型,这在日常和竞争性编程中很有用。本文旨在提供有关某些转换函数的信息。
- 学完了net/http和fasthttp两个HTTP协议接口的客户端实现,接下来就要开始Server的开发,不学不知道一学吓一跳,居然这两个
- 为了处理根据Web标准创作的网页和根据盛行于20世纪90年代末的旧时实践创作的网页,当代的Web浏览器实现了各种不同的引擎模式。本文说明了那
- 很多人一直都有个想法,要是可以随心所欲的操作iframe就好了。这样静态页面也就有了相当于后台动态页面php,jsp,asp中include
- 前言plt.show()展示图片的时候,截图进行保存,图片不是多么清晰如何保存高清图也是一知识点函数包名:import matplotlib
- YUI Compressor 压缩 JavaScript 的内容包括:移除注释移除额外的空格细微优化标识符替换(Identifier Rep
- 使用Python的pillow模块 random 模块随机生成验证码图片,并应用到Django项目中安装pillow$ pip3 insta
- 最近对list设计感兴趣,今天说的是list视图方式的设计。感觉有些细节非常有意思,拿出来跟大家讨论。首先我们来看下windows下文件夹管
- image.jsp------------------------------生成随机验证码图片的Jsp页面 代码如下: <
- 前言python 可以做网站应用,也可以做客户端应用。但是客户端应用需要运行 py 脚本,如果用户不懂 python 就是一件比较麻烦的事情
- 一、文章概述本文将要讲述的是Python环境下如何用OpenCV检测人脸,本文的主要内容分为:1、检测图片中的人脸2、实时检测视频中出现的人
- MySQL插件式存储引擎是MySQL数据库服务器中的组件,负责为数据库执行实际的数据I/O操作,并能允许和强制执行面向特殊应用需求的特定特性
- 1. 原理2014年的一篇文章,开创cnn用到文本分类的先河。Convolutional Neural Networks for Sente
- 最近好多分享这个问题的代码,题目说的是用面向对象或者函数式编程,下面是PYTHON的实现示例#!/usr/bin/python#encodi
- Pytorch调用forward()函数Module类是nn模块里提供的一个模型构造类,是所有神经网络模块的基类,我们可以继承它来定义我们想