tensorflow - 将 `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_outputs
fromrnn_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
实际上什么都不做的重塑如何使代码工作?
解决方案
推荐阅读
- c# - 如何在运行时加载不同的 MsBuild 版本工具?
- html - 角点动画
- android - 使用刷新令牌在访问令牌过期之前刷新它
- kubernetes - 通过 values.yaml 公开多个 containerPort
- python - 运行时优化 (Python)
- python - 如何使用python和postgres拉一行并更新该行列中的布尔值?
- sql - 将行字符串拆分为列
- arrays - 为什么“echo $array”在这种特定情况下打印数组的所有成员,而不是像在任何其他情况下只打印第一个成员?
- c++ - 在全局容器中存储局部变量的内存地址
- raspberry-pi - 如何使用带有 V4L2 (v4l2-ctl) 的 Raspberry Pi 相机以固定曝光记录照片?