TensorFlow.jl输出dynamic_rnn的形状

时间:2017-12-11 22:41:33

标签: tensorflow julia lstm

  • Julia 0.6.0
  • TensorFlow.jl 0.7.5
  • tensorflow(python)1.4.1
  • 操作系统:Ubuntu 16.04

我正在为时间序列预测设置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)))

有人知道这是故意的,是一个错误,还是我错过了这一点?

1 个答案:

答案 0 :(得分:1)

你是对的。 与Python TensorFlow的dynamic_rnn不同,TensorFlow.jl的dynamic_rnn, 只返回最后一步结束时的输出和状态。

这是因为TensorFlow.jl不支持在运行时创建动态大小的张量。 有方法,但他们目前没有被用于此。 我认为python使用TensorArrays, 我们目前还没有。

简单的解决方案是不使用dynamic_rnn

TensorFlow.jl静态RNN即TensorFlow.nn.rnn具有基本相同的接口,但在每个时间步返回输出。

我在issues中注意到这一点。