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接口

 

Logo

昇腾计算产业是基于昇腾系列(HUAWEI Ascend)处理器和基础软件构建的全栈 AI计算基础设施、行业应用及服务,https://devpress.csdn.net/organization/setting/general/146749包括昇腾系列处理器、系列硬件、CANN、AI计算框架、应用使能、开发工具链、管理运维工具、行业应用及服务等全产业链

更多推荐