Repository navigation
【快乐开源】Paddle Tensor 规范化二期 API 支持 0-size Tensor No.16-17:paddle.var、paddle.std - #71580
cangtianhuang wants to merge 17 commits into
Conversation
|
你的PR提交成功,感谢你对开源项目的贡献! |
…uang/Paddle into support-0-size-var-std
There was a problem hiding this comment.
同样添加一下int、complex相关的类型单测,预期输出参考:https://data-apis.org/array-api/latest/API_specification/generated/array_api.mean.html#mean
wanghuancoder
left a comment
There was a problem hiding this comment.
var是一个比较“高层”的API,对于elementwise、reduce类的问题修复,最好以elementwise相关API和reduce相关API先做为case做全量摸底修复。
| PADDLE_ENFORCE_GE(x.numel(), | ||
| 0, | ||
| common::errors::InvalidArgument( | ||
| "Tensor need be reduced must not empty.")); | ||
| "The input size (numel) of reduce op should be larger " | ||
| "than or equal to 0")); |
There was a problem hiding this comment.
这里还不能直接放行。最好配合0-Size报错里的所有reduce相关API一起验证修复~
There was a problem hiding this comment.
是的,新的pr中未做此修改
| axis)); | ||
|
|
||
| // Intercept the 0-size dimension case | ||
| bool has_zero_dim = false; |
There was a problem hiding this comment.
这个叫has_0_size更好。0 dim指的是len(shape)==0的Tensor
| GetReduceDims(x.dims(), dims, reduce_all, &reduce_dims); | ||
|
|
||
| int r = xpu::SUCCESS; | ||
| if (reduce_dims.size() == 0) { |
There was a problem hiding this comment.
这个不能删除:
reduce_dims.size() == 0 代表 axis=None,比如 paddle.sum(x, axis=None)
x.dims().size() == 0 代表 0D Tensor
x.numel() == 0 代表 0Size Tensor
不能混淆~
PR Category
Operator Mechanism
PR Types
Bug fixes
Description
该 PR 修改了
paddle.var的 C++ 与 python 代码,使其支持处理 0-size Tensor 。paddle.std未作修改。增加了测试用例,包括多个形状的 0-size Tensor ,如 [], [0,], [0, 3], [2, 0, 4]。注: #71555 合并后,经测试已经解决了
unbiased=False时的 0-size tensor 情况,但当unbiased=True时,输出仍不符合预期。期望的值:("std", float("nan")), ("var", float("nan"))。具体修改如下:
paddle.var在 C++ 侧,修改了
xpu/elementwise.h与xpu/reduce.h文件,使的 xpu 支持 0-size Tensor。在 Python 侧,在
python/paddle/tensor/stat.py中对n > one_const处做了一个巧妙的修改,使得当n<=1时 n 值不变(unbiased = True时,n=1无法无偏,n=0则out/0得到期望的NaN值;unbiased = False时,n=0out/0也得到期望的NaN值),确保形状与数值永远满足期望。paddle.std在 Python 侧,
paddle.std调用paddle.var并开方,对于 0-size TensorNaN开方后仍旧为NaN,因此代码不变。经测试,
paddle.var、paddle.std通过了 “0-size tensorAPI 支持 0-size Tensor No.16、17” 的测试。且在 [], [0,], [0, 3], [2, 0, 4] 等多个 0-size Tensor 形状中表现与预期一致。测试结果如下: