|
12 | 12 |
|
13 | 13 | ---------- |
14 | 14 |
|
| 15 | +##### 问题:请问`paddle.gather`和`torch.gather`有什么区别? |
| 16 | + |
| 17 | ++ 答复:[`paddle.gather`](https://www.paddlepaddle.org.cn/documentation/docs/zh/api/paddle/gather_cn.html#gather)和`torch.gather`的函数签名分别为: |
| 18 | + |
| 19 | +```python |
| 20 | +paddle.gather(x, index, axis=None, name=None) |
| 21 | +torch.gather(input, dim, index, *, sparse_grad=False, out=None) |
| 22 | +``` |
| 23 | + |
| 24 | +其中,`paddle.gather`的参数`x`,`index`,`axis`分别与`torch.gather`的参数`input`,`index`,`dim`意义相同。 |
| 25 | + |
| 26 | +两者在输入形状、输出形状、计算公式等方面都有区别,具体如下: |
| 27 | + |
| 28 | +- `paddle.gather` |
| 29 | + |
| 30 | + - 输入形状:`x`可以是任意的`N`维Tensor。但`index`必须是形状为`[M]`的一维Tensor,或形状为`[M, 1]`的二维Tensor。 |
| 31 | + |
| 32 | + - 输出形状:输出Tensor `out`的形状`shape_out`和`x`的形状`shape_x`的关系为:`shape_out[i] = shape_x[i] if i != axis else M`。 |
| 33 | + |
| 34 | + - 计算公式:`out[i_1][i_2]...[i_axis]...[i_N] = x[i_1][i_2]...[index[i_axis]]...[i_N]` 。 |
| 35 | + |
| 36 | + - 举例说明:假设`x`的形状为`[N1, N2, N3]`,`index`的形状为`[M]`,`axis`的值为1,那么输出`out`的形状为`[N1, M, N3]`,且`out[i_1][i_2][i_3] = x[i_1][index[i_2]][i_3]`。 |
| 37 | + |
| 38 | +- `torch.gather` |
| 39 | + |
| 40 | + - 输入形状:`input`可以是任意的`N`维Tensor,且`index.rank`必须等于`input.rank`。 |
| 41 | + |
| 42 | + - 输出形状:输出Tensor `out`的形状与`index`相同。 |
| 43 | + |
| 44 | + - 计算公式:`out[i_1][i_2]...[i_dim]...[i_N] = input[i_1][i_2]...[index[i_1][i_2]...[i_N]]...[i_N]`。 |
| 45 | + |
| 46 | + - 举例说明:假设`x`的形状为`[N1, N2, N3]`,`index`的形状为`[M1, M2, M3]`,`dim`的值为1,那么输出`out`的形状为`[M1, M2, M3]`,且`out[i_1][i_2][i_3] = input[i_1][index[i_1][i_2][i_3]][i_3]`。 |
| 47 | + |
| 48 | +- 异同比较 |
| 49 | + |
| 50 | + - 只有当`x.rank == 1`且`index.rank == 1`时,`paddle.gather`和`torch.gather`功能相同。其余情况两者无法直接互换使用。 |
| 51 | + |
| 52 | + - `paddle.gather`不支持`torch.gather`的`sparse_grad`参数。 |
| 53 | + |
| 54 | +---------- |
| 55 | + |
15 | 56 | ##### 问题:在模型组网时,inplace参数的设置会影响梯度回传吗?经过不带参数的op之后,梯度是否会保留下来? |
16 | 57 |
|
17 | 58 | + 答复:inplace 参数不会影响梯度回传。只要用户没有手动设置`stop_gradient=True`,梯度都会保留下来。 |
|
0 commit comments