TensorFlow调用Keras库函数存在的问题

    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

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值