轻松调试,让报错无处遁形 |昇思MindSpore报错调试宝典(五):网络构建与训练类报错之算子执行错误
上一期讲解了由于输入参数不符合要求、算子功能不支持等算子编译错误问题该如何定位解决,那么在算子执行的时候也会遇到很多报错,比如输入数据异常、算子实现错误、功能限制、资源限制等问题,遇到这类情形我们正常可以采用类比的分析方法,本期以mindspore.ops.ResizeBicubic算子内部数据没有进行定义进而导致输出异常为例来讲解下如何定位问题并解决报错。
详细内容请查看海报~
文字内容:
小孢子:你好呀,昇思MindSpore,我们又见面了!这次通过调用mindspore.ops.ResizeBicubic算子接口调整图像大小时遇到了报错,能帮我分析看看如何debug不?
MindSpore: 当然没问题!照旧先看看你的环境信息、脚本代码与报错~
小孢子:系统环境信息:
Hardware Environment(Ascend/GPU/CPU): CPU
Software Environment:
-- MindSpore version (source or binary): 2.0.0-alpha
-- Python version (e.g., Python 3.7.5): 3.7.5
-- OS platform and distribution (e.g., Linux Ubuntu 16.04): Ubuntu 4.15.0-74-generic
训练脚本(使用插值调整图像大小):
01 import mindspore
02 from mindspore import Tensor
03 import mindspore.ops as ops
04
05 resize_bicubic_op = ops.ResizeBicubic(align_corners=True,half_pixel_centers=False)
06 images = Tensor(x_np)
07 size = Tensor(size, mindspore.int32)
08 output = resize_bicubic_op(images, size)
09 print(output.asnumpy())
报错信息:
Traceback (most recent call last):
File "< doctest_example.txt[4]>", line 1, in <module>
images = Tensor(x_np)
NameError: name 'x_np' is not defined #①
File "< doctest_example.txt[5]>", line 1, in <module>
size = Tensor(size, mindspore.int32)
NameError: name 'size' is not defined #②
File "< doctest_example.txt[6]>", line 1, in <module>
output = resize_bicubic_op(images, size)
NameError: name 'images' is not defined #③
File "< doctest_example.txt[7]>", line 1, in <module>
print(output.asnumpy())
NameError: name 'output' is not defined #④
MindSpore:首先我们查看报错信息,①中的异常是由于‘images = Tensor(x_np)’这段代码引起的,主要是命名定义类的错误,‘x_np’没有被赋予定义,同理②和③的错误异常也是由于‘size’、‘images’是没有被定义的,而④中‘output’的报错是由于前面的‘images’没有定义,这样‘output = resize_bicubic_op(images, size)’这段代码就无法执行,从而导致最后的‘print(output.asnumpy())’无法输出结果;换句话说,由于定义的缺失导致mindspore.ops.ResizeBicubic算子缺少了一些输入,进而打印不出输出结果并产生报错。
小孢子:那我知道解决办法啦,既然缺少定义那就直接都给他们定义完整就行啦!这个我会!
修改后的正确代码如下:
01 import mindspore
02 from mindspore import Tensor
03 from mindspore import ops
04
05 x_np = np.array([1, 2, 3, 4]).astype(np.float32).reshape(1, 1, 2, 2)
06 size = (1, 4)
07 images = Tensor(x_np)
08 size = Tensor(size, mindspore.int32)
09 resize_bicubic_op = ops.ResizeBicubic(align_corners=True, half_pixel_centers=False)
10 output = resize_bicubic_op(images, size)
11 print(output.asnumpy())
MindSpore:你还真是一点就通!所以这个时候执行打印结果一定是符合预期的。
小孢子:对的!你快看执行结果:
[[[[1. 1.3144622 1.6855378 2.]]]]
MindSpore:因此今天这个报错问题首先需要结合报错信息和打印结果,发现错误是由于算子未定义本身引起的,进而可以定位问题并修改出错,同时也提醒了我们需要关注变量定义、初始化的正确性。
小孢子:我记住啦!算子执行过程中也要考虑到方方面面才能避免出错!不多说啦,我要回去研究研究资源不足导致的报错咯~
MindSpore:好呀,下次我们交流这个问题!
小孢子:好的!期待下次见面!
报错地图:https://www.hiascend.com/forum/thread-0229108045633055169-1-1.html
往期回顾:
昇思MindSpore报错调试宝典(一):数据加载与处理类:https://www.hiascend.com/forum/thread-0215111378750918013-1-1.html
MindSpore报错调试宝典(二):网络构建与训练类报错之context配置问题:https://www.hiascend.com/forum/thread-0227112497811434016-1-1.html
昇思MindSpore报错调试宝典(三):网络构建与训练类报错之语法问题:https://www.hiascend.com/forum/thread-0232113194535560002-1-1.html
昇思MindSpore报错调试宝典(四):网络构建与训练类报错之算子编译错误:https://www.hiascend.com/forum/thread-0203114399255966005-1-1.html