dynamic_rnn中的Tensorflow 1.0 LSTM单元格会导致维度错误

时间:2017-03-24 12:06:52

标签: tensorflow lstm

我正在尝试将LSTM模型实现为Estimator的model_fn输入。我的X只是一个带有时间序列价格的.txt。在进入我的第一个隐藏层之前,我尝试将lstm单元格定义为:

  def lstm_cell():
   return tf.contrib.rnn.BasicLSTMCell(
   size, forget_bias=0.0, state_is_tuple=True)
  attn_cell = lstm_cell
  if is_training and keep_prob < 1:
   def attn_cell():
    return tf.contrib.rnn.DropoutWrapper(
    lstm_cell(), output_keep_prob=keep_prob)
  cell = tf.contrib.rnn.MultiRNNCell([attn_cell() for _ in  range(num_layers)], state_is_tuple=True)
  initial_state = cell.zero_state(batch_size, data_type())
  inputs = tf.unstack(X, num=num_steps, axis=0)  
  outputs = []
  outputs, state = tf.nn.dynamic_rnn(cell, inputs,
                           initial_state=initial_state)

这应该进入:

  first_hidden_layer = tf.contrib.layers.relu(outputs, 1000)

不幸的是,它会抛出一个错误,指出&#34; ValueError:Dimension必须为1,但对于&#39; transpose&#39; (op:&#39; Transpose&#39;)输入形状:[1],[3]。&#34; 我认为我的问题是&#34;输入&#34;张量。在其描述中,输入变量应该是一个形式为[batch_size,max_time,...]的张量,但我不知道如何将其转换为上述结构,因为通过估算器,只有输入值X和目标值y被送到系统。所以我的问题是如何创建一个可以作为dynamic_rnn类的输入变量的张量。

非常感谢。

1 个答案:

答案 0 :(得分:1)

我相信你不需要这一行:

inputs = tf.unstack(X, num=num_steps, axis=0)

您可以直接向X提供dynamic_rnn,因为dynamic_rnn未列出张量列表;它需要一个张量,其中时间轴为维度0(如果time_major == True)或维度1(如果time_major == False)。

实际上,X似乎只有2个维度,因为inputs是1维张量列表(如错误消息所示)。所以你应该用unstack替换为:

inputs = tf.expand_dims(X, axis=2)

这将添加dynamic_rnn

所需的第3个尺寸为1的尺寸