Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 定义一个函数在运行阶段之前迭代张量_Python_Tensorflow_Tensor - Fatal编程技术网

Python 定义一个函数在运行阶段之前迭代张量

Python 定义一个函数在运行阶段之前迭代张量,python,tensorflow,tensor,Python,Tensorflow,Tensor,我定义了一个损失函数,其中我必须迭代张量的值。当然,这是在培训阶段之前编写的python函数,我正在努力研究如何在张量上定义for循环。在这个张量中,有一些零和其他数字,但我不知道有多少,这取决于当前批次的训练文件。可能是2,5,10。。。我不知道,所以我不能使用固定值。这里有一个例子 points = tf.constant([[[0], [1], [0], [2], [1], [0], [2], [2], [0], [1]], [[1], [2],

我定义了一个损失函数,其中我必须迭代张量的值。当然,这是在培训阶段之前编写的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 (?,)
当然,给出这些错误是因为在定义阶段我没有值,但我不知道如何修复它。

我根据“在定义阶段我没有值”假设您在需要迭代数据集的会话中

您可以使用
tf.while\u循环(cond,body,loop\u vars)
并在每个张量的末尾添加结束条件。这应该是一些不会在数据集中显示的值。例如,如果数据集仅包含正实数,则可以使用
-1
作为结束条件

基本上,
tf.while\u loop(cond,body,loop\u vars)
首先调用
cond
,它应该返回一个布尔张量。同时,如果
cond
没有返回false,则将使用
loop\u vars
调用
body
。请注意,要在循环中使用的所有内容都应包含在
loop\u vars
中。全局变量和
循环\u vars
上下文之外的变量将不起作用

因此,您可以使用
t=tf.constant(0)
作为时间步长,并在每次通过
body
时递增它。然后,在
cond
中,通过使用
x[t]
在每次迭代中获取值,可以检查数据集
x
是否等于结束条件。如果它等于此结束条件,则表示已完全迭代了张量,
cond
应返回false。否则,
cond
应该返回true,然后您可以使用
t
作为某些数据集
x
的迭代器,方法是在
正文中使用
x[t]

这就是我用来解决RNN中可变长度句子的迭代问题的方法。我使用了
作为我的最终条件,它工作得很好。我希望这也适用于你

我根据“在定义阶段,我没有值”假设您在需要迭代数据集的会话中

您可以使用
tf.while\u循环(cond,body,loop\u vars)
并在每个张量的末尾添加结束条件。这应该是一些不会在数据集中显示的值。例如,如果数据集仅包含正实数,则可以使用
-1
作为结束条件

基本上,
tf.while\u loop(cond,body,loop\u vars)
首先调用
cond
,它应该返回一个布尔张量。同时,如果
cond
没有返回false,则将使用
loop\u vars
调用
body
。请注意,要在循环中使用的所有内容都应包含在
loop\u vars
中。全局变量和
循环\u vars
上下文之外的变量将不起作用

因此,您可以使用
t=tf.constant(0)
作为时间步长,并在每次通过
body
时递增它。然后,在
cond
中,通过使用
x[t]
在每次迭代中获取值,可以检查数据集
x
是否等于结束条件。如果它等于此结束条件,则表示已完全迭代了张量,
cond
应返回false。否则,
cond
应该返回true,然后您可以使用
t
作为某些数据集
x
的迭代器,方法是在
正文中使用
x[t]

这就是我用来解决RNN中可变长度句子的迭代问题的方法。我使用了
作为我的最终条件,它工作得很好。我希望这也适用于你