From d55e4781ecd768bbc12e772004ea3102bc32fce5 Mon Sep 17 00:00:00 2001 From: sneaxiy Date: Fri, 12 Nov 2021 00:41:00 +0800 Subject: [PATCH 1/4] add gather cn faq --- docs/faq/train_cn.md | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/docs/faq/train_cn.md b/docs/faq/train_cn.md index d1a78640ee0..ea5404768a4 100644 --- a/docs/faq/train_cn.md +++ b/docs/faq/train_cn.md @@ -12,6 +12,47 @@ ---------- +##### 问题:请问`paddle.gather`和`torch.gather`有什么区别? + ++ 答复:`paddle.gather`和`torch.gather`的函数签名分别为: + +```python +paddle.gather(x, index, axis=None, name=None) +torch.gather(input, dim, index, *, sparse_grad=False, out=None) +``` + +其中,`paddle.gather`的参数`x`,`index`,`axis`分别与`torch.gather`的参数`input`,`dim`,`index`意义相同。 + +两者在输入形状、输出形状、计算公式等方面都有区别,具体如下: + +1. `paddle.gather` + +- 输入形状:`x`可以是任意的`N`维Tensor。但`index`必须是形状为`[M]`的一维Tensor,或形状为`[M, 1]`的二维Tensor。 + +- 输出形状:输出Tensor `out`的形状`shape_out`和`x`的形状`shape_x`的关系为:`shape_out[i] = shape_x[i] if i != axis else M`。 + +- 计算公式:`out[i_1][i_2]...[i_axis]...[i_N] = x[i_1][i_2]...[index[i_axis]]...[i_N]` 。 + +- 举例说明:假设`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]`。 + +2. `torch.gather` + +- 输入形状:`input`可以是任意的`N`维Tensor,且`index.rank`必须等于`input.rank`。 + +- 输出形状:输出Tensor `out`的形状与`index`相同。 + +- 计算公式:`out[i_1][i_2]...[i_dim]...[i_N] = input[i_1][i_2]...[index[i_1][i_2]...[i_N]]...[i_N]`。 + +- 举例说明:假设`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]`。 + +3. 异同比较 + +- 只有当`x.rank == 1`且`index.rank == 1`时,`paddle.gather`和`torch.gather`功能相同。其余情况两者无法直接互换使用。 + +- `paddle.gather`不支持`torch.gather`的`sparse_grad`参数。 + +---------- + ##### 问题:在模型组网时,inplace参数的设置会影响梯度回传吗?经过不带参数的op之后,梯度是否会保留下来? + 答复:inplace 参数不会影响梯度回传。只要用户没有手动设置`stop_gradient=True`,梯度都会保留下来。 From 9df6e01a46511a566f06180de88abac399f4c204 Mon Sep 17 00:00:00 2001 From: sneaxiy Date: Fri, 12 Nov 2021 11:43:58 +0800 Subject: [PATCH 2/4] follow comments --- docs/faq/train_cn.md | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/docs/faq/train_cn.md b/docs/faq/train_cn.md index ea5404768a4..827b83480d7 100644 --- a/docs/faq/train_cn.md +++ b/docs/faq/train_cn.md @@ -14,42 +14,42 @@ ##### 问题:请问`paddle.gather`和`torch.gather`有什么区别? -+ 答复:`paddle.gather`和`torch.gather`的函数签名分别为: ++ 答复:[`paddle.gather`](https://www.paddlepaddle.org.cn/documentation/docs/zh/api/paddle/gather_cn.html#gather)和`torch.gather`的函数签名分别为: ```python paddle.gather(x, index, axis=None, name=None) torch.gather(input, dim, index, *, sparse_grad=False, out=None) ``` -其中,`paddle.gather`的参数`x`,`index`,`axis`分别与`torch.gather`的参数`input`,`dim`,`index`意义相同。 +其中,`paddle.gather`的参数`x`,`index`,`axis`分别与`torch.gather`的参数`input`,`index`,`dim`意义相同。 两者在输入形状、输出形状、计算公式等方面都有区别,具体如下: -1. `paddle.gather` +- `paddle.gather` -- 输入形状:`x`可以是任意的`N`维Tensor。但`index`必须是形状为`[M]`的一维Tensor,或形状为`[M, 1]`的二维Tensor。 + - 输入形状:`x`可以是任意的`N`维Tensor。但`index`必须是形状为`[M]`的一维Tensor,或形状为`[M, 1]`的二维Tensor。 -- 输出形状:输出Tensor `out`的形状`shape_out`和`x`的形状`shape_x`的关系为:`shape_out[i] = shape_x[i] if i != axis else M`。 + - 输出形状:输出Tensor `out`的形状`shape_out`和`x`的形状`shape_x`的关系为:`shape_out[i] = shape_x[i] if i != axis else M`。 -- 计算公式:`out[i_1][i_2]...[i_axis]...[i_N] = x[i_1][i_2]...[index[i_axis]]...[i_N]` 。 + - 计算公式:`out[i_1][i_2]...[i_axis]...[i_N] = x[i_1][i_2]...[index[i_axis]]...[i_N]` 。 -- 举例说明:假设`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]`。 + - 举例说明:假设`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]`。 -2. `torch.gather` +- `torch.gather` -- 输入形状:`input`可以是任意的`N`维Tensor,且`index.rank`必须等于`input.rank`。 + - 输入形状:`input`可以是任意的`N`维Tensor,且`index.rank`必须等于`input.rank`。 -- 输出形状:输出Tensor `out`的形状与`index`相同。 + - 输出形状:输出Tensor `out`的形状与`index`相同。 -- 计算公式:`out[i_1][i_2]...[i_dim]...[i_N] = input[i_1][i_2]...[index[i_1][i_2]...[i_N]]...[i_N]`。 + - 计算公式:`out[i_1][i_2]...[i_dim]...[i_N] = input[i_1][i_2]...[index[i_1][i_2]...[i_N]]...[i_N]`。 -- 举例说明:假设`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]`。 + - 举例说明:假设`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]`。 -3. 异同比较 +- 异同比较 -- 只有当`x.rank == 1`且`index.rank == 1`时,`paddle.gather`和`torch.gather`功能相同。其余情况两者无法直接互换使用。 + - 只有当`x.rank == 1`且`index.rank == 1`时,`paddle.gather`和`torch.gather`功能相同。其余情况两者无法直接互换使用。 -- `paddle.gather`不支持`torch.gather`的`sparse_grad`参数。 + - `paddle.gather`不支持`torch.gather`的`sparse_grad`参数。 ---------- From 99824b9e093511ba74f6e10b2bb5950a83ce862c Mon Sep 17 00:00:00 2001 From: sneaxiy Date: Fri, 12 Nov 2021 12:17:36 +0800 Subject: [PATCH 3/4] fix format again --- docs/faq/train_cn.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/faq/train_cn.md b/docs/faq/train_cn.md index 827b83480d7..e7fcbf3c441 100644 --- a/docs/faq/train_cn.md +++ b/docs/faq/train_cn.md @@ -25,7 +25,7 @@ torch.gather(input, dim, index, *, sparse_grad=False, out=None) 两者在输入形状、输出形状、计算公式等方面都有区别,具体如下: -- `paddle.gather` +1. `paddle.gather` - 输入形状:`x`可以是任意的`N`维Tensor。但`index`必须是形状为`[M]`的一维Tensor,或形状为`[M, 1]`的二维Tensor。 @@ -35,7 +35,7 @@ torch.gather(input, dim, index, *, sparse_grad=False, out=None) - 举例说明:假设`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]`。 -- `torch.gather` +2. `torch.gather` - 输入形状:`input`可以是任意的`N`维Tensor,且`index.rank`必须等于`input.rank`。 From bb22e71d05a5f4cc5298f14dbdc13c6ea9a132ce Mon Sep 17 00:00:00 2001 From: sneaxiy Date: Fri, 12 Nov 2021 12:23:00 +0800 Subject: [PATCH 4/4] fix again --- docs/faq/train_cn.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/faq/train_cn.md b/docs/faq/train_cn.md index e7fcbf3c441..827b83480d7 100644 --- a/docs/faq/train_cn.md +++ b/docs/faq/train_cn.md @@ -25,7 +25,7 @@ torch.gather(input, dim, index, *, sparse_grad=False, out=None) 两者在输入形状、输出形状、计算公式等方面都有区别,具体如下: -1. `paddle.gather` +- `paddle.gather` - 输入形状:`x`可以是任意的`N`维Tensor。但`index`必须是形状为`[M]`的一维Tensor,或形状为`[M, 1]`的二维Tensor。 @@ -35,7 +35,7 @@ torch.gather(input, dim, index, *, sparse_grad=False, out=None) - 举例说明:假设`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]`。 -2. `torch.gather` +- `torch.gather` - 输入形状:`input`可以是任意的`N`维Tensor,且`index.rank`必须等于`input.rank`。