MindSpore报错: Conv2D输入shape填充后的高和宽必须大于卷积核的高和宽
1 报错描述
1.1 系统环境
Hardware Environment(Ascend/GPU/CPU): Ascend Software Environment: -- MindSpore version (source or binary): 2.0.0 -- Python version (e.g., Python 3.7.5): 3.7.6 -- OS platform and distribution (e.g., Linux Ubuntu 16.04): Ubuntu 4.15.0-74-generic -- GCC/Compiler version (if compiled from source):
1.2 基本信息
1.2.1 脚本
训练脚本是通过构建Conv2D的单算子网络,来实现2d卷积操作的。脚本如下:
01 class Net(nn.Cell):
02 def __init__(self, in_channels, out_channels, kernel_size):
03 super(Net, self).__init__()
04 self.in_channels = in_channels
05 self.out_channels = out_channels
06 self.kernel_size = kernel_size
07 # self.pad_mode = "valid"
08 self.conv2d = nn.Conv2d(self.in_channels, self.out_channels, self.kernel_size, pad_mode="valid")
09
10 def construct(self, x):
11 return self.conv2d(x)
12
13 net = Net(in_channels=2, out_channels=10, kernel_size=64)
14 x = Tensor(np.random.randn(1, 2, 4, 64), mindspore.float32)
15 y = net(x).shape
16 print("otput shape: ", y)
复制
1.2.2 报错
这里报错信息如下:
Traceback (most recent call last):
File "bits_and_bobs1.py", line 37, in <module>
y = net(x).shape
File "/home/miniconda3/envs/lilinjie/lib/python3.7/site-packages/mindspore/nn/cell.py", line 657, in __call__
raise err
File "/home/miniconda3/envs/lilinjie/lib/python3.7/site-packages/mindspore/nn/cell.py", line 653, in __call__
output = self._run_construct(args, kwargs)
File "/home/miniconda3/envs/lilinjie/lib/python3.7/site-packages/mindspore/nn/cell.py", line 418, in _run_construct
output = self.construct(*cast_inputs, **kwargs)
File "bits_and_bobs1.py", line 33, in construct
return self.conv2d(x)
File "/home/miniconda3/envs/lilinjie/lib/python3.7/site-packages/mindspore/nn/cell.py", line 657, in __call__
raise err
File "/home/miniconda3/envs/lilinjie/lib/python3.7/site-packages/mindspore/nn/cell.py", line 653, in __call__
output = self._run_construct(args, kwargs)
File "/home/miniconda3/envs/lilinjie/lib/python3.7/site-packages/mindspore/nn/cell.py", line 418, in _run_construct
output = self.construct(*cast_inputs, **kwargs)
File "/home/miniconda3/envs/lilinjie/lib/python3.7/site-packages/mindspore/nn/layer/conv.py", line 312, in construct
output = self.conv2d(x, self.weight)
File "/home/miniconda3/envs/lilinjie/lib/python3.7/site-packages/mindspore/ops/primitive.py", line 317, in __call__
return _run_op(self, self.name, args)
File "/home/miniconda3/envs/lilinjie/lib/python3.7/site-packages/mindspore/ops/primitive.py", line 816, in _run_op
return _run_op_sync(obj, op_name, args)
File "/home/miniconda3/envs/lilinjie/lib/python3.7/site-packages/mindspore/common/api.py", line 101, in wrapper
results = fn(*arg, **kwargs)
File "/home/miniconda3/envs/lilinjie/lib/python3.7/site-packages/mindspore/ops/primitive.py", line 822, in _run_op_sync
output = _pynative_executor.real_run_op(obj, op_name, args)
File "/home/miniconda3/envs/lilinjie/lib/python3.7/site-packages/mindspore/common/api.py", line 1013, in real_run_op
return self._executor.real_run_op(*args)
ValueError: For 'Conv2d', input shape's h and w after padding must be greater than or equal to kernel_size's h and w respectively.
- C++ Call Stack: (For framework developers)
mindspore/core/ops/conv2d.cc:248 Conv2dInferShape
复制
原因分析
我们看报错信息,在ValueError中,写到input shape's h and w after padding must be greater than or equal to kernel_size's h and w respectively,意思是Conv2d的输入shape的的高和宽在填充之后应该分别大于kernel_size的高和宽,否输出shape将为异常值。根据Conv2d的官网资料提供的公式,当pad_mode为“valid”时,选择第二组公式代入数据得到H-out为-59,显然不合理。解决的方法有调整传入的参数大小或者将pad_mode设置为“same”

2 解决方法
基于上面已知的原因,很容易做出如下修改:
01 class Net(nn.Cell):
02 def init(self, in_channels, out_channels, kernel_size):
03 super(Net, self).init()
04 self.in_channels = in_channels
05 self.out_channels = out_channels
06 self.kernel_size = kernel_size
07 # self.pad_mode = "valid"
08 self.conv2d = nn.Conv2d(self.in_channels, self.out_channels, self.kernel_size, pad_mode="valid")
09
10 def construct(self, x):
11 return self.conv2d(x)
12
13 net = Net(in_channels=2, out_channels=10, kernel_size=64)
14 x = Tensor(np.random.randn(1, 2, 64, 64), mindspore.float32)
15 y = net(x).shape
16 print("output shape: ", y)
复制
此时执行成功,输出如下:
output shape: (1, 10, 1, 1)
3 总结
定位报错问题的步骤:
1、找到报错的用户代码行:y = net(x).shape;
2、 根据日志报错信息中的关键字,缩小分析问题的范围input shape's h and w after padding must be greater than or equal to kernel_size's h and w respectively ;
3、需要重点关注变量定义、初始化的正确性。
4 参考文档
4.1 Conv2D算子API接口
昇腾计算产业是基于昇腾系列(HUAWEI Ascend)处理器和基础软件构建的全栈 AI计算基础设施、行业应用及服务,https://devpress.csdn.net/organization/setting/general/146749包括昇腾系列处理器、系列硬件、CANN、AI计算框架、应用使能、开发工具链、管理运维工具、行业应用及服务等全产业链
更多推荐

所有评论(0)