假设我有一个输入张量如下:
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
。
答案 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_inputs
是tf.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)