如何在TensorFlow中循环遍历可变长度的占位符?

时间:2017-05-05 21:28:32

标签: tensorflow

假设我有一个输入张量如下:

x_inputs = tf.placeholder(tf.float32, shape=[1, None], name='x_inputs')

这是一个可变长度输入的占位符。

另外,我有一个嵌入矩阵:

embeddings = tf.Variable(
    tf.random_uniform([vocabulary_size, embedding_size], -1.0, 1.0),
    name='embeddings')

我想查找输入序列的每个元素的嵌入并将它们一起添加以构建单个嵌入向量。类似于(在python中)的东西:

embed = tf.zeros([batch_size, embedding_size])

for element in range(num_inputs):
  embed += tf.nn.embedding_lookup(embeddings,
                                  tf.cast(x_inputs[:, element], tf.int32))

如果num_inputs已修复,一切正常。 问题是num_inputs的值在训练过程中发生了变化,我需要在图表中计算出来。我不知道如何根据for loop中的输入值计算图表中的上述x_inputs

1 个答案:

答案 0 :(得分:3)

tf.nn.embeddings_lookup可以处理可变大小的参数:

x_inputs = tf.placeholder(tf.int32, shape=[1, None], name='x_inputs')
embeddings = tf.constant([[1,2,3], [4,5,6], [7,8,9]])

iterSession = tf.InteractiveSession()

embed = tf.squeeze(tf.nn.embeddings_lookup(embeddings, x_inputs))

iterSession.run(embed, feed_dict={x_inputs: [[0, 1, 0, 2]]})
# array([[1, 2, 3],
#       [4, 5, 6],
#       [1, 2, 3],
#       [7, 8, 9]], dtype=int32)

iterSession.run(tf.reduce_sum(embed, axis=0), feed_dict={x_inputs: [[0, 1, 0, 2]]})
# array([13, 17, 21], dtype=int32)

请注意,x_inputstf.int32类型的直接,避免了演员。

如果您希望在执行期间长度是动态的并且使用嵌入作为示例,您可以使用tf.foldl来编写它:

embed = tf.foldl(lambda a, x: a + tf.nn.embedding_lookup(embeddings, x),
                 tf.reshape(x_inputs, (-1,)), 
                 initializer=[[0, 0, 0]])
iterSession.run(embed, feed_dict={x_inputs: [[0, 1, 0, 2]]})
# array([[13, 17, 21]], dtype=int32)