# 数据集加载-GeneratorDataset数据处理报错：The pointer\[cnode\] is null

MindSpore可以自定义Python数据源，通过迭代该数据源构造数据集。有点类似PyTorch的DataLoader。

**1. 相关的API可以参考：[mindspore.dataset.GeneratorDataset](https://www.mindspore.cn/docs/api/zh-CN/master/api_python/dataset/mindspore.dataset.GeneratorDataset.html#mindspore.dataset.GeneratorDataset)**

在 MindSpore 1.5.0 + Pynative + GPU环境下，使用GeneratorDataset接口加载自定义集时，使用了网络算子或Tensor操作，比如下面这个就用了Tensor的slide操作

由于python不检查输入参数的类型，所以\_\_call\_\_函数的输入img在pynative模式下，会是一个Tensor类型的变量

![](figures/7.png)

因此，如果将Tensor相关的操作放到数据集处理的map操作中，会报出如下错误：

![](figures/8.png)

![](figures/9.png)

==================================================

Caught RuntimeError in map\(or batch\) worker and execute Python function

The pointer\[cnode\] is null

==================================================

**2. 原因分析：**

由于python不检查输入参数的类型，所以\_\_call\_\_函数的输入img在pynative模式下，会是一个Tensor类型的变量

Pynative模式时，\_\_call\_\_函数的输入img参数会是一个Tensor类型的变量，并且在\_\_call\_\_函数中，通过img\[:, sh:eh, sw:ew\]触发了Tensor的slice操作，会调用底层的算子进行执行。同时，由于数据集处理为并发执行，会启动多个线程/进程进行计算，而当前Tensor操作不支持并发执行，会引发一些异常。

**3. 解决办法：**

用户自定义的Pyfunc中，先把入参转为为Numpy类型，再通过Numpy相关操作实现相关功能。

即在\_\_call\_\_的第一行插入类型转换

![](figures/10-9.png)

**4. 其他错误相关帖：**

[https://gitee.com/mindspore/mindspore/issues/I4L06P](https://gitee.com/mindspore/mindspore/issues/I4L06P)

[https://gitee.com/mindspore/mindspore/issues/I4GP4J](https://gitee.com/mindspore/mindspore/issues/I4GP4J)

