Paddle 关于在动态图中使用fluid.layers.sampling_id的疑惑

soat7uwm  于 2021-11-30  发布在  Java
关注(0)|答案(2)|浏览(308)
  • 版本、环境信息:

   1)PaddlePaddle版本:1.8.2 cuda7.6
   2)系统环境:win10
   3)Python版本号: 3.7

with fluid.dygraph.guard():
        prob = np.array([[0.1, 0.5, 0.3,0.1],[0.1, 0.5, 0.3,0.1], [0.1, 0.5, 0.3,0.1],[0.1, 0.5, 0.3,0.1]])
        prob = fluid.dygraph.base.to_variable(prob)
        out = fluid.layers.sampling_id(prob,min=0,max =2,seed=10)
        _out = out.numpy()
        print(_out)
        ii = 5

以上代码输出[3 3 3 3], 但根据理解,batch_size为4,每个分布有4个项,可选[0,1,2,3],再加上min=0,max =2,则最后每个分布的可选项应该在区间[0,2]间,那为何结果是[3 3 3 3]呢?

另,若希望从某个分布取n个样本(而不是1个)要怎么写呢,若没有现成的函数,希望能参考pytorch的multinomial函数仿写一个。

gz5pxeao

gz5pxeao1#

Paddle/paddle/fluid/operators/sampling_id_op.h

Line 59 in 2b61db0

| | int idx = width - 1; |

感谢您的问题,可以看一下相关的实现,可能sampling_id的理解有一些偏差,在上面这个链接的代码里面是一个batch里面的每一行都先随机一个(min,max)之间的数,然后减去这一行从头开始的每一个数,一直到小于0的时候,记录当前的index作为结果返回。如果一整行都减去,仍然大于0,就返回最后一个index 在您这个例子中也就是3。

这就是为什么出现[3,3,3,3]

6ju8rftf

6ju8rftf2#

@wangjiawei04 您好,感谢回复。 那么若要实现我提问中所述的批量多个离散分布采样的话,是否暂时paddlepaddle中并没有现成的,只能用numpy来完成了?

相关问题