# 通道顺序错误引起matplotlib.image.imsave执行报错:raise ValueError\("Third dimension must be 3 or 4"\)

**1. 系统环境**

```
硬件环境(Ascend/GPU/CPU): GPU
软件环境: MindSpore 版本: 1.7.0
执行模式： 静态图(GRAPH)
Python 版本: 3.7.6
操作系统平台: linux
```

**2. 报错信息**

2.1 问题描述

将优化好的图像用matplotlib进行图片保存，由于没有将图像的通道进行转换，导致图像保存失败。

2.2 报错信息

```
raise ValueError("Third dimension must be 3 or 4") ValueError: Third dimension must be 3 or 4
```

2.3 脚本代码

```
import matplotlib.image as mp
context.set_context(mode=context.GRAPH_MODE, device_target="GPU")

adversarial_tensor, mask_tensor  = adversarial.train(attack_method)
mp.imsave('./对抗图像.jpg', adversarial_tensor.asnumpy())
```

**3. 根因分析**

![](figures/1-51.png)

看报错信息ValueError:三维必须是3或4。说明维度的具体值有问题。

![](figures/2-52.png)

调试发现adversarial\_tensor通道是（3，112，112）。通过查阅发现，Tensor的形状都是\[C,H,W\]格式，而要用matplotlib保存为图像需要的形状是\[H,W,C\]格式，所以需要对通道进行转换。

**4. 解决方案**

解决方案说明： 利用np.transpose函数来实现通道的转换。

修改后代码：

```
import matplotlib.image as mp
context.set_context(mode=context.GRAPH_MODE, device_target="GPU")

adversarial_tensor, mask_tensor  = adversarial.train(attack_method)
mp.imsave("./对抗图像.jpg",
                np.transpose(adversarial_tensor.asnumpy(), (1, 2, 0)))
```

正常执行结果adversarial\_tensor可以保存为图片。

