-
Notifications
You must be signed in to change notification settings - Fork 5.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
【PaddlePaddle Hackathon 2】11新增 API index_fill #42454
Conversation
你的PR提交成功,感谢你对开源项目的贡献! |
python/paddle/tensor/manipulation.py
Outdated
fill_value) | ||
|
||
helper = LayerHelper("index_fill", **locals()) | ||
check_variable_and_dtype(x, 'x', ['float32', 'float64', 'int32', 'int64'], |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
增加注册的数据类型后,此处需要同步修改。
@iclementine 老师,您好,似乎我没有用AxisTensor以及IndexTensor,也可以运行并测试成功,AxisTensor和axis这种组合是必须的吗? 如果按照slice的那种写法,就会报错, 不清楚为什么slice可以。动态图里scale里面也没有将scale时tensor时作为输入,只是经态图有相应的改变。 868: Traceback (most recent call last): 静态图按照slice的写法是没有问题的。 |
打扰了,我是参赛者,我觉得上面的代码可能有问题,如果没问题,那当我没说。是否需要在使用EigenTensor<T, 3>之前,将x 和 fill_grad 先 Resize 成 3 维的 Tensor, 因为你在 if(output) { 中也是这样做的, 但是 x 是 const的, 无法 Resize |
@SmirnovKol 嗯 严谨一些,需要resize,待审核老师回复可以一起优化一下。 |
@SmirnovKol 因为这里,在你的代码里测试出bug了吗? |
关于这个我没有跑出bug, 我只是单纯地有点看不懂,谢谢回复 |
关于这个函数def index_fill_fill_value_grad_np(data, axis, index): |
index_fill 中的 fill_value, index_add中的 add_value: 你的思路似乎是 将 X 中所有被 index 取到的 元素的个数作为 fill_value 的 grad, |
@SmirnovKol 说的没错,是可以这么简化计算。当时主要是为了体现在算子里的计算逻辑,方便后面好回忆。 |
@SmirnovKol 那个地方代码组织得有些不太好,命名容易误解,当时也是为了抽取共同的代码,减少代码量。实际上,可以仔细阅读下,fill_value取的也是初始的out_grad梯度之和 |
我还想确认一下:
|
我借用一下你的地方提问题。请 paddle专家解答一下吧。 |
对于第一点, index_fill只是覆盖原来的元素,所以问题不大。 |
你说得没错,index_fill 应该问题不大, 我自己再研究一下吧 |
你指的是,不需要在 kernel 中将 axis 和 index 两个参数声明为 Scalar 和 IntArray, 也能在 python API 中传入 Tensor 吗? |
需要在kernel里声明 Scalar 和 IntArray。 我指的是在python声明的函数里 |
@iclementine 虽然这次任务失败,希望老师可以继续review,我想完成这个PR |
好的呀,谢谢支持哦~,我们继续交流。 |
sclae 使用了比较 tricky 的方式来处理 if in_dygraph_mode():
# 这个是近期的动态图方案,是间接调用 c++ API 实现的
out = _C_ops.final_state_scale(x, scale, float(bias), bias_after_scale)
return dygraph_utils._append_activation_in_dygraph(out)
if _non_static_mode():
# 这里利用了动态图下可以对 Tensor 求值的特征,如果 scale 是 Tensor, 就把 scale 转换成了 float
_scale = scale.numpy().item(0) if isinstance(scale, Variable) else scale
out = _C_ops.scale(x, 'scale',
float(_scale), 'bias',
float(bias), 'bias_after_scale', bias_after_scale)
return dygraph_utils._append_activation_in_dygraph(out) 至于如果用写成 op_function_name(input1, input2,..., attr_name1, attr_value1, attr_name2, attr_value2,...) 这样传参的。Input 都是直接传入的,attr 都是以 我需要 pull 一下你的代码做做测试才能给出明确的答案。 |
paddle 里面有 broadcast 的机制,可以参考 elementwise 系列 op 的实现机制。正向的时候进行了 broadcast, 反向的时候就会有一个相应的 reduce. 可以参考一下 |
@iclementine感谢指导。我学习heaviside op时接触到了elementwise 系列op, 当时就猜想要想add_value 能是任意shape, 可能要借鉴使用elementwise op的实现。奈何肚子里墨水少,只学过几句话,还写不了大文章,等我学完背完十几、二十几篇大文章后,我应该就能独立完成一篇文章了。读书破万卷,下笔如有神。现在觉得这句话真是不变的真理。 |
Sorry to inform you that 61e514e's CIs have passed for more than 7 days. To prevent PR conflicts, you need to re-run all CIs manually. |
Since you haven't replied for more than a year, we have closed this issue/pr. |
PR types
New features
PR changes
APIs
Describe
完成第二期第11项目开发任务: #40324
对于 nd tensor, 沿着某个轴 axis 取 (n-1)d 的切片,索引位置是 index, 并且将 value 中值填充到这些切片上。其中 value 是一个 scalar 或者 0d tensor
RFC设计文档: PaddlePaddle/community#122