gpt4 book ai didi

tensorflow - 如何循环 TensorFlow 中的可变长度占位符?

转载 作者:行者123 更新时间:2023-12-03 09:49:07 25 4
gpt4 key购买 nike

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

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 的值在训练过程中发生了变化,我需要在图中计算它。我不知道如何根据 x_inputs 中的输入值计算图中的上述 for 循环

最佳答案

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)

关于tensorflow - 如何循环 TensorFlow 中的可变长度占位符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43813995/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com