使用mindspore.ops.MaxPool3D算子设置为ceil_mode=True时,在MindSpore1.8.1和1.9.0版本中计算结果不一致
收藏回复举报
使用mindspore.ops.MaxPool3D算子设置为ceil_mode=True时,在MindSpore1.8.1和1.9.0版本中计算结果不一致
发表于2023-01-30 11:41:14
0 查看

1 系统环境

硬件环境(Ascend/GPU/CPU): Ascend/GPU/CPU

MindSpore版本: 1.8.1、1.9.0

执行模式(PyNative/ Graph): 不限模式

Python版本: 3.7.5

操作系统平台: Ubuntu 16.04

2 报错信息

2.1  问题描述

mindspore 1.9.0 mindspore.ops.MaxPool3D在ceil_mode=True时计算结果出现问题

2.2  报错信息

1.8.1
mindspore version: 1.8.1
input shape: (4, 3, 6, 6, 5)
res shape: (4, 3, 3, 3, 2)
no ceil res shape: (4, 3, 2, 2, 2)

1.9.0
mindspore version: 1.9.0
input shape: (4, 3, 6, 6, 5)
res shape: (4, 3, 2, 2, 2)
no ceil res shape: (4, 3, 2, 2, 2)

2.3  脚本代码(代码格式,可上传附件)

import mindspore as ms
import numpy as np

print(f"mindspore version: {ms.__version__}")
a = ms.Tensor(np.random.randn(4, 3, 6, 6, 5), ms.float32)
print(f"input shape: {a.shape}")
maxpool = ms.ops.MaxPool3D(kernel_size=3, strides=2, pad_mode="pad", pad_list=0, ceil_mode=True)
res = maxpool(a)
print(f"res shape: {res.shape}")
maxpool = ms.ops.MaxPool3D(kernel_size=3, strides=2, pad_mode="pad", pad_list=0, ceil_mode=False)
res = maxpool(a)
print(f"no ceil res shape: {res.shape}")

3 根因分析

******此处由用户补充详细的定位过程******

移植python侧infer到cpp侧,python 中整数相除会保存浮点数结果,cpp 中忽略了此处细节,使用int型保存结果,造成整除,ceil失去意义。可以在Cpp infer中使用浮点数保存中间计算结果,确保ceil生效,和python侧逻辑保持一致。

4 解决方案

******此处由用户填写******

包含文字方案和最终脚本代码

支持上传附件

我要发帖子