华为Mindspore Create python object ‘<class ‘type’>’ failed, only support to create ‘Cell’ or ‘Primitive’ object.
想在模型的construct里取出中间参数进行可视化,却发现参数很奇怪。按照官方文档,可以对Tensor进行.asnumpy()操作转为numpy array类型,也可以用type()打印出Tensor的类型。但在实际操作中,在编译阶段就会报错,不允许对Tensor这样操作。
我打印了Tensor,发现它的格式是Tensor(shape=…, dtype=…, value=…),与模型外打印的Tensor格式不同。最后在这篇博客发现了问题所在:在我之前的代码中,设定成了Graph图模式(也称静态图模式)。静态图模式将神经网络模型编译成一整张图,然后再下发执行,优点是利用图优化等技术提高运行性能,同时有助于规模部署和跨平台运行。
参考官方文档,而还有一种模式,是PyNative动态图模式,将神经网络中的各个算子逐一下发执行,方便用户编写和调试神经网络模型。
粗略地理解,静态图和动态图模式的区别就像tensorflow和pytorch。因此想要像pytorch一样方便地在中间对数据进行操作,就要将模型切换为动态图。
在main函数的开始加入以下语句:
1 | context.set_context(mode=context.PYNATIVE_MODE) |