torch_npu.npu_ifmr
API接口
torch_npu.npu_ifmr(Tensor data, Tensor data_min, Tensor data_max, Tensor cumsum, float min_percentile, float max_percentile, float search_start, float search_end, float search_step, bool with_offset) -> (Tensor, Tensor)
功能描述
使用“begin,end,strides”数组对ifmr结果进行计数。
参数说明
- data (Tensor) - 特征图张量。
- data_min (Tensor) - 特征图最小值的张量。
- data_max (Tensor) - 特征图最大值的张量。
- cumsum (Tensor) - cumsum bin数据张量。
- min_percentile (Float) - 最小初始化百分位数。
- max_percentile (Float) - 最大初始化百分位数。
- search_start (Float) - 搜索起点。
- search_end (Float) - 搜索终点。
- search_step (Float) - 搜索步长。
- with_offset (Bool) - 是否使用offset。
输出说明
- scale (Tensor) - 最优尺度。
- offset (Tensor) - 最优offset。
示例
>>> input = torch.rand((2,2,3,4),dtype=torch.float32).npu()
>>> input
tensor([[[[0.4508, 0.6513, 0.4734, 0.1924],
[0.0402, 0.5502, 0.0694, 0.9032],
[0.4844, 0.5361, 0.9369, 0.7874]],
[[0.5157, 0.1863, 0.4574, 0.8033],
[0.5986, 0.8090, 0.7605, 0.8252],
[0.4264, 0.8952, 0.2279, 0.9746]]],
[[[0.0803, 0.7114, 0.8773, 0.2341],
[0.6497, 0.0423, 0.8407, 0.9515],
[0.1821, 0.5931, 0.7160, 0.4968]],
[[0.7977, 0.0899, 0.9572, 0.0146],
[0.2804, 0.8569, 0.2292, 0.1118],
[0.5747, 0.4064, 0.8370, 0.1611]]]], device='npu:0')
>>> min_value = torch.min(input)
>>> min_value
tensor(0.0146, device='npu:0')
>>> max_value = torch.max(input)
>>> max_value
tensor(0.9746, device='npu:0')
>>> hist = torch.histc(input.to('cpu'),
bins=128,
min=min_value.to('cpu'),
max=max_value.to('cpu'))
>>> hist
tensor([1., 0., 0., 2., 0., 0., 0., 1., 1., 0., 1., 0., 1., 0., 0., 0., 0., 0.,
0., 1., 0., 0., 2., 1., 0., 0., 0., 0., 2., 1., 0., 0., 0., 0., 0., 1.,
0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0.,
1., 0., 0., 0., 1., 1., 0., 1., 1., 0., 1., 0., 1., 0., 0., 1., 0., 1.,
0., 0., 1., 0., 0., 2., 0., 0., 0., 0., 0., 0., 2., 0., 0., 0., 0., 0.,
0., 0., 1., 1., 0., 0., 0., 0., 0., 1., 0., 0., 0., 1., 1., 2., 0., 0.,
1., 1., 1., 0., 1., 0., 0., 1., 0., 1., 1., 0., 0., 0., 1., 0., 1., 1.,
0., 1.]) >>> cdf = torch.cumsum(hist,dim=0).int().npu()
>>> cdf
tensor([ 1, 1, 1, 3, 3, 3, 3, 4, 5, 5, 6, 6, 7, 7, 7, 7, 7, 7,
7, 8, 8, 8, 10, 11, 11, 11, 11, 11, 13, 14, 14, 14, 14, 14, 14, 15,
15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16,
17, 17, 17, 17, 18, 19, 19, 20, 21, 21, 22, 22, 23, 23, 23, 24, 24, 25,
25, 25, 26, 26, 26, 28, 28, 28, 28, 28, 28, 28, 30, 30, 30, 30, 30, 30,
30, 30, 31, 32, 32, 32, 32, 32, 32, 33, 33, 33, 33, 34, 35, 37, 37, 37,
38, 39, 40, 40, 41, 41, 41, 42, 42, 43, 44, 44, 44, 44, 45, 45, 46, 47,
47, 48], device='npu:0', dtype=torch.int32)
>>> scale, offset = torch_npu.npu_ifmr(input,
min_value,
max_value,
cdf,
min_percentile=0.999999,
max_percentile=0.999999,
search_start=0.7,
search_end=1.3,
search_step=0.01,
with_offset=False)
>>> scale tensor(0.0080, device='npu:0')
>>> offset tensor(0., device='npu:0')
父主题: torch_npu