在 运行 阶段之前定义一个函数来迭代张量
Define a function to iterate over a tensor before the running phase
我正在定义一个损失函数,我必须在其中迭代张量的值。当然,这是在训练阶段之前编码的 python 函数,我正在努力研究如何在张量上定义 for 循环。在这个张量中,有一些零和其他数字,但我不知道有多少,这取决于当前批次的训练文件。可能是 2、5、10,...我不知道,所以我不能使用固定值。举个例子
points = tf.constant([[[0], [1], [0], [2], [1], [0], [2], [2], [0], [1]],
[[1], [2], [0], [0], [1], [0], [1], [2], [0], [2]],
[[0], [2], [1], [0], [2], [0], [1], [2], [0], [1]]], dtype=tf.float32)
max_indices = tf.reduce_max(points[:1])
for index in xrange(max_indices): # error here
# do stuff
这是错误
TypeError: an integer is required
所以我尝试用另一种方式使用这个
points = tf.constant([[[0], [1], [0], [2], [1], [0], [2], [2], [0], [1]],
[[1], [2], [0], [0], [1], [0], [1], [2], [0], [2]],
[[0], [2], [1], [0], [2], [0], [1], [2], [0], [1]]], dtype=tf.float32)
items, _ = tf.unique(tf.reshape(points[:1], [-1]))
for item in tf.unstack(items): # error here
# do stuff
错误是
ValueError: Cannot infer num from shape (?,)
当然会给出这些错误,因为在定义阶段我没有值,但我不知道如何修复它。
我假设基于 "in the definition phase I don't have values",当您需要迭代数据集时,您正处于会话中。
您可以使用 tf.while_loop(cond, body, loop_vars)
并在每个张量的末尾添加结束条件。这应该是一些不会显示在您的数据集中的值。例如,如果您的数据集仅包含正实数,则可以使用 -1
作为结束条件。
基本上,tf.while_loop(cond, body, loop_vars)
首先调用 cond
应该 return 一个布尔张量。同时,如果 cond
不 return false,body
将与 loop_vars
一起调用。请注意,您要在循环中使用的所有内容都应包含在 loop_vars
中。 loop_vars
上下文之外的全局变量和变量将不起作用。
因此您可以使用 t = tf.constant(0)
作为时间步长,并在每次通过 body
时增加它。然后,在 cond
中,您可以通过使用 x[t]
在每次迭代中获取值来检查您的数据集 x
是否等于您的结束条件。如果它等于这个结束条件,你已经完全迭代了你的张量并且 cond
应该 return false。否则,cond
应该 return 为真,然后您可以通过在 body
中使用 x[t]
将 t
用作某些数据集 x
的迭代器.
这就是我用来解决循环神经网络中可变长度句子迭代的问题。我使用 <end>
作为结束条件,效果很好。我希望这对你也有用!
我正在定义一个损失函数,我必须在其中迭代张量的值。当然,这是在训练阶段之前编码的 python 函数,我正在努力研究如何在张量上定义 for 循环。在这个张量中,有一些零和其他数字,但我不知道有多少,这取决于当前批次的训练文件。可能是 2、5、10,...我不知道,所以我不能使用固定值。举个例子
points = tf.constant([[[0], [1], [0], [2], [1], [0], [2], [2], [0], [1]],
[[1], [2], [0], [0], [1], [0], [1], [2], [0], [2]],
[[0], [2], [1], [0], [2], [0], [1], [2], [0], [1]]], dtype=tf.float32)
max_indices = tf.reduce_max(points[:1])
for index in xrange(max_indices): # error here
# do stuff
这是错误
TypeError: an integer is required
所以我尝试用另一种方式使用这个
points = tf.constant([[[0], [1], [0], [2], [1], [0], [2], [2], [0], [1]],
[[1], [2], [0], [0], [1], [0], [1], [2], [0], [2]],
[[0], [2], [1], [0], [2], [0], [1], [2], [0], [1]]], dtype=tf.float32)
items, _ = tf.unique(tf.reshape(points[:1], [-1]))
for item in tf.unstack(items): # error here
# do stuff
错误是
ValueError: Cannot infer num from shape (?,)
当然会给出这些错误,因为在定义阶段我没有值,但我不知道如何修复它。
我假设基于 "in the definition phase I don't have values",当您需要迭代数据集时,您正处于会话中。
您可以使用 tf.while_loop(cond, body, loop_vars)
并在每个张量的末尾添加结束条件。这应该是一些不会显示在您的数据集中的值。例如,如果您的数据集仅包含正实数,则可以使用 -1
作为结束条件。
基本上,tf.while_loop(cond, body, loop_vars)
首先调用 cond
应该 return 一个布尔张量。同时,如果 cond
不 return false,body
将与 loop_vars
一起调用。请注意,您要在循环中使用的所有内容都应包含在 loop_vars
中。 loop_vars
上下文之外的全局变量和变量将不起作用。
因此您可以使用 t = tf.constant(0)
作为时间步长,并在每次通过 body
时增加它。然后,在 cond
中,您可以通过使用 x[t]
在每次迭代中获取值来检查您的数据集 x
是否等于您的结束条件。如果它等于这个结束条件,你已经完全迭代了你的张量并且 cond
应该 return false。否则,cond
应该 return 为真,然后您可以通过在 body
中使用 x[t]
将 t
用作某些数据集 x
的迭代器.
这就是我用来解决循环神经网络中可变长度句子迭代的问题。我使用 <end>
作为结束条件,效果很好。我希望这对你也有用!