mindspore.nn.Pad
- class mindspore.nn.Pad(paddings, mode='CONSTANT')[源代码]
根据 paddings 和 mode 对输入进行填充。
- 参数:
paddings (tuple) - 填充大小,其shape为 \((N, 2)\) ,N是输入数据的维度,填充的元素为int类型。对于 x 的第 D 个维度,paddings[D, 0]表示要在输入Tensor的第 D 个维度之前扩展的大小,paddings[D, 1]表示在输入Tensor的第 D 个维度后面要扩展的大小。每个维度填充后的大小为: \(paddings[D, 0] + input\_x.dim\_size(D) + paddings[D, 1]\)。
# 假设参数和输入如下: mode = "CONSTANT". paddings = [[1,1], [2,2]]. x = [[1,2,3], [4,5,6], [7,8,9]]. # `x` 的第一个维度为3, `x` 的第二个维度为3。 # 根据以上公式可得: # 输出的第一个维度是paddings[0][0] + 3 + paddings[0][1] = 1 + 3 + 1 = 5。 # 输出的第二个维度是paddings[1][0] + 3 + paddings[1][1] = 2 + 3 + 2 = 7。 # 所以最终的输出shape为(5, 7)
mode (str) - 指定填充模式。取值为
"CONSTANT"
(常数填充) ,"REFLECT"
(反射填充) ,"SYMMETRIC"
(对称填充) 。默认值:"CONSTANT"
。
- 输入:
x (Tensor) - 输入Tensor。
- 输出:
Tensor,填充后的Tensor。
如果 mode 为"CONSTANT", x 使用0进行填充。例如, x 为[[1,2,3],[4,5,6],[7,8,9]], paddings 为[[1,1],[2,2]],则输出为[[0,0,0,0,0,0,0],[0,0,1,2,3,0,0],[0,0,4,5,6,0,0],[0,0,7,8,9,0,0],[0,0,0,0,0,0,0]]。
如果 mode 为"REFLECT", x 使用对称轴进行对称复制的方式进行填充(复制时不包括对称轴)。例如 x 为[[1,2,3],[4,5,6],[7,8,9]], paddings 为[[1,1],[2,2]],则输出为[[6,5,4,5,6,5,4],[3,2,1,2,3,2,1],[6,5,4,5,6,5,4],[9,8,7,8,9,8,7],[6,5,4,5,6,5,4]]。
如果 mode 为"SYMMETRIC",此填充方法类似于"REFLECT"。也是根据对称轴填充,包含对称轴。例如 x 为[[1,2,3],[4,5,6],[7,8,9]], paddings 为[[1,1],[2,2]],则输出为[[2,1,1,2,3,3,2],[2,1,1,2,3,3,2],[5,4,4,5,6,6,5],[8,7,7,8,9,9,8],[8,7,7,8,9,9,8]]。
- 异常:
TypeError - paddings 不是tuple。
ValueError - paddings 的长度超过4或其shape不是 \((N, 2)\) 。
ValueError - mode 不是
'CONSTANT'
,'REFLECT'
或'SYMMETRIC'
。
- 支持平台:
Ascend
GPU
CPU
样例:
>>> import mindspore >>> from mindspore import Tensor, nn, ops >>> import numpy as np >>> # If `mode` is "CONSTANT" >>> class Net(nn.Cell): ... def __init__(self): ... super(Net, self).__init__() ... self.pad = nn.Pad(paddings=((1, 1), (2, 2)), mode="CONSTANT") ... def construct(self, x): ... return self.pad(x) >>> x = Tensor(np.array([[1, 2, 3], [4, 5, 6]]), mindspore.float32) >>> pad = Net() >>> output = pad(x) >>> print(output) [[0. 0. 0. 0. 0. 0. 0.] [0. 0. 1. 2. 3. 0. 0.] [0. 0. 4. 5. 6. 0. 0.] [0. 0. 0. 0. 0. 0. 0.]] >>> # Another way to call >>> pad = ops.Pad(paddings=((1, 1), (2, 2))) >>> # From the above code, we can see following: >>> # "paddings=((1, 1), (2, 2))", >>> # paddings[0][0] = 1, indicates a row of values is filled top of the input data in the 1st dimension. >>> # Shown as follows: >>> # [[0. 0. 0.] >>> # [1. 2. 3.] >>> # [4. 5. 6.]] >>> # paddings[0][1] = 1 indicates a row of values is filled below input data in the 1st dimension. >>> # Shown as follows: >>> # [[0. 0. 0.] >>> # [1. 2. 3.] >>> # [4. 5. 6.] >>> # [0. 0. 0.]] >>> # paddings[1][0] = 2, indicates 2 rows of values is filled in front of input data in the 2nd dimension. >>> # Shown as follows: >>> # [[0. 0. 0. 0. 0.] >>> # [0. 0. 1. 2. 3.] >>> # [0. 0. 4. 5. 6.] >>> # [0. 0. 0. 0. 0.]] >>> # paddings[1][1] = 2, indicates 2 rows of values is filled in front of input data in the 2nd dimension. >>> # Shown as follows: >>> # [[0. 0. 0. 0. 0. 0. 0.] >>> # [0. 0. 1. 2. 3. 0. 0.] >>> # [0. 0. 4. 5. 6. 0. 0.] >>> # [0. 0. 0. 0. 0. 0. 0.]] >>> output = pad(x) >>> print(output) [[0. 0. 0. 0. 0. 0. 0.] [0. 0. 1. 2. 3. 0. 0.] [0. 0. 4. 5. 6. 0. 0.] [0. 0. 0. 0. 0. 0. 0.]] >>> # if mode is "REFLECT" >>> class Net(nn.Cell): ... def __init__(self): ... super(Net, self).__init__() ... self.pad = nn.Pad(paddings=((1, 1), (2, 2)), mode="REFLECT") ... def construct(self, x): ... return self.pad(x) >>> x = Tensor(np.array([[1, 2, 3], [4, 5, 6]]), mindspore.float32) >>> pad = Net() >>> output = pad(x) >>> print(output) [[6. 5. 4. 5. 6. 5. 4.] [3. 2. 1. 2. 3. 2. 1.] [6. 5. 4. 5. 6. 5. 4.] [3. 2. 1. 2. 3. 2. 1.]] >>> # if mode is "SYMMETRIC" >>> class Net(nn.Cell): ... def __init__(self): ... super(Net, self).__init__() ... self.pad = nn.Pad(paddings=((1, 1), (2, 2)), mode="SYMMETRIC") ... def construct(self, x): ... return self.pad(x) >>> x = Tensor(np.array([[1, 2, 3], [4, 5, 6]]), mindspore.float32) >>> pad = Net() >>> output = pad(x) >>> print(output) [[2. 1. 1. 2. 3. 3. 2.] [2. 1. 1. 2. 3. 3. 2.] [5. 4. 4. 5. 6. 6. 5.] [5. 4. 4. 5. 6. 6. 5.]]