Paddle ifelse控制流必须是persistables的变量吗,还有可以只用一个true_block或者false_block

lhcgjxsq  于 2021-11-30  发布在  Java
关注(0)|答案(9)|浏览(380)

1)PaddlePaddle版本:1.5.1
2)CPU/GPU:cpu
3)系统环境:Mac OS 10.13.6

  • 复现信息:如为报错,请给出复现环境、复现步骤

运行上面的代码,输出如下:

没有输出大于0的部分。
然后如果两部分都输出:

报下面的错误

093gszye

093gszye1#

这个错误跟是否是persistable无关。错误提示中的mask_dim,也就是代码中的作为IfElse条件的cond,按照错误提示,应该是要求cond的dims为1,这里你传入的长度是4。

你想获得tensor中大于0的元素,可以调用relu

另外,issue中建议尽量贴文字,不要贴图,一是贴图不能被索引,二是我们不能直接拷贝来验证和复现。

t3irkdon

t3irkdon2#

谢谢回答,我下次贴代码。我直接用的greater_than得到的cond为什么会维度对应不上呢;还有我只想要大于0的元素,其余的元素不要,如果用relu的话输出还是哪些个元素啊。

x6h2sr28

x6h2sr283#

greater_than(x, y),会对x和y逐个元素进行比较,返回与x、y长度相同的bool类型tensor,你这个例子里,cond应该是[True, True, False, False]。

你可以用where获取大于0的元素的位置。

你实际应用中数据的维度是多少?

ne5o7dgx

ne5o7dgx4#

我想问的是为什么greater_than得到的cond,然后用IfElse为什么会报错;
数据维度肯定是要任意的啊,我想要什么维度的都可以得到其中所有大于0或者是别的条件的所有值。

icomxhvb

icomxhvb5#

这很正常啊,greater_than支持任意维度;IfElse的cond要求dims为[1]。如果greater_than输入数据的dims为[1],那得到的结果就可以用于IfElse。

举个例子,假如输入是2维的,x =[[1, -2, 3], [-1, -2, 3]],那么你要的输出的维度是多少?

dxpyg8gm

dxpyg8gm6#

那如果greater_than输出的cond维度不为1该如何解决啊;
对于这个x =[[1, -2, 3], [-1, -2, 3]],我如果要输出大于0的值,期望输出是[1,3,3]这样的

inkz8wg9

inkz8wg97#

目前来看,有以下两种方案:

  1. 用基础op组装。对cond变量用where操作,取出True值所在位置的索引index,然后用gather(x, index)。注意,你可能需要加入一些reshape操作。
  2. 用py_func。
fxnxkyjh

fxnxkyjh8#

把a 改成这样试一下

a = np.array([[3], [5], [-1], [-3]]).astype(np.float32)
moiiocjp

moiiocjp9#

嗯,好使了谢谢 @NHZlX

相关问题