首页 > 解决方案 > 将 `dynamic_rnn` 替换为 `tf.keras.layers.RNN` 给出不同的结果

问题描述

对于一个简单的many to one时间序列预测问题,我想在给定前 4 个值的情况下预测一个值,我使用的代码使用dynamic_rnn. 我想用tf.keras.layers.RNN. 以下是我的替换实现

from tensorflow.keras.layers import LSTMCell, Dense, RNN

batch_size = 32
n_steps = 4
n_inputs = 3
n_outputs = 1
n_neurons = 64

cell = LSTMCell(units=n_neurons, activation=tf.nn.relu)
x_ph = tf.placeholder(tf.float32, [batch_size, n_steps, n_inputs], name='x_ph')

if use_dynamic_rnn:
    rnn_outputs, states = dynamic_rnn(cell, x_ph, dtype=tf.float32) 
    rnn_outputs= tf.reshape(rnn_outputs[:,-1,:], [-1, n_neurons])


else:
    rnn_layer = RNN(cell)
    rnn_outputs = rnn_layer(x_ph)

dense_layer= Dense( n_outputs, activation='relu')
dense_output = dense_layer(rnn_outputs)
outputs = tf.reshape(dense_output , [-1, n_outputs])

当我设置时use_dynamic_rnn=True,我的损失值没有减少,这意味着我犯了一些错误。有人可以指出错误吗?

编辑:重塑张量使代码工作,但不知道为什么

我重塑了rnn_outputsfromrnn_layer并且代码工作正常,但我的重塑实际上没有做任何事情,因为重塑之前和重塑之后的形状保持不变。以下代码正在运行


if use_dynamic_rnn:
    rnn_outputs, states = dynamic_rnn(cell, x_ph, dtype=tf.float32) 
    rnn_outputs= tf.reshape(rnn_outputs[:,-1,:], [-1, n_neurons])


else:
    rnn_layer = RNN(cell)
    rnn_outputs = rnn_layer(x_ph)
    print(rnn_outputs.shape, 'before reshaping')
    rnn_outputs = tf.reshape(rnn_outputs[:,:], [-1,n_neurons])  # what is this doing?
    print(rnn_outputs.shape, 'before reshaping')

从以下打印语句中可以看出,tf.reshape使用后形状不会改变。

(32, 64) before reshaping
(32, 64) after reshaping outputs shape 

实际上什么都不做的重塑如何使代码工作?

标签: tensorflowkerasrecurrent-neural-networkkeras-layertf.keras

解决方案


推荐阅读