我正在为时间序列预测设置LSTM。我需要每个时间步的输出,因为我想计算损失不仅仅是最后一个时间步。根据{{3}},dynamic_rnn
的输出应具有[batch_size, max_time, cell.output_size]
形状(如果time_major == False
)。
在python中,这很好用:
import tensorflow as tf
import numpy as np
batch_size = 3
series_length = 10
hidden_size = 7
number_of_features = 2
session = tf.Session()
x = tf.placeholder(tf.float32, [None, series_length, number_of_features])
cell = tf.contrib.rnn.BasicLSTMCell(hidden_size)
outputs, state = tf.nn.dynamic_rnn(cell, x, dtype=tf.float32)
session.run(tf.global_variables_initializer())
o = session.run(outputs, feed_dict={x: np.random.randn(batch_size, series_length, number_of_features)})
outputs
的形状为[3, 10, 7]
,与[batch_size, series_length, hidden_size]
一致。
现在,我可以使用密集层在每个时间步输出单个值y。
当我使用TensorFlow.jl时,outputs
的形状[3, 7]
对应[batch_size, hidden_size]
。这似乎只是最后一步。
using TensorFlow
tf = TensorFlow
batch_size = 3
series_length = 10
number_of_features = 2
hidden_size = 7
session = tf.Session()
x = tf.placeholder(Float32, shape=[-1, series_length, number_of_features])
cell = tf.nn.rnn_cell.LSTMCell(hidden_size)
outputs, state = tf.nn.dynamic_rnn(cell, x)
run(session, global_variables_initializer())
o = run(session, [outputs], Dict(x=>rand(Float32, batch_size, series_length, number_of_features)))
有人知道这是故意的,是一个错误,还是我错过了这一点?
答案 0 :(得分:1)
你是对的。
与Python TensorFlow的dynamic_rnn
不同,TensorFlow.jl的dynamic_rnn
,
只返回最后一步结束时的输出和状态。
这是因为TensorFlow.jl不支持在运行时创建动态大小的张量。 有方法,但他们目前没有被用于此。 我认为python使用TensorArrays, 我们目前还没有。
简单的解决方案是不使用dynamic_rnn
。
TensorFlow.jl静态RNN即TensorFlow.nn.rnn
具有基本相同的接口,但在每个时间步返回输出。
我在issues中注意到这一点。