在Tensorflow中将LSTM连接到完全连接的层

时间:2017-03-10 12:38:32

标签: tensorflow

我尝试使用以下代码在Tensorflow中建立从LSTM层到完全连接层的连接:

# lstm_outputs has shape 1x10x100
rnn_out = tf.reshape(lstm_outputs, [-1, 100])
# rnn_out has shape 10x100

现在我想在RNN的输出中添加一个1x10向量,并将这个新张量输入完全连接的层。

extra_params = tf.placeholder(shape=[1,10], dtype=tf.float32)
fc_input = tf.concat(1,[rnn_out,extra_params])
fc1 = slim.fully_connected(fc_input,o_size,
    activation_fn=tf.nn.relu,
    weights_initializer=tf.truncated_normal_initializer(),
    biases_initializer=None)

但是代码在tf.concat行上给出了以下错误:

  

TypeError:预期int32,得到包含类型的张量的列表   ' _Message'代替。

我有两个与此代码相关的问题:

  1. 我需要做些什么才能让预期的张量进入完全连接的层?
  2. 我实际上是在为完全连接的层提供什么?它是1x1010张量还是10x110张量?

1 个答案:

答案 0 :(得分:3)

假设你正在使用TensorFlow 1.0,TypeError是由tf.concat()的参数顺序错误引起的(有时在TensorFlow 0.12周围切换):它需要一个{{1}的列表首先是对象,然后是要连接这些张量的轴。

但是,如果您只是反转参数(tf.Tensor),则会出现与形状相关的错误。 tf.concat([rnn_out, extra_params], 1)要求其所有输入具有相同的维度,除了在您连接的轴上。但是,tf.concat()是10 x 100矩阵,而rnn_out是1 x 10矩阵,因此这些张量不兼容连接。

正确的解决方案取决于extra_params应该代表什么。例如,如果10是训练中的批量大小,则可以将extra_params转换为10 x 1矩阵。以下程序应该有效:

extra_params