# LeNet-5实际应用中报错以及调试过程

**1. 系统环境**

硬件环境\(Ascend/GPU/CPU\): Ascend/GPU/CPU

软件环境: MindSpore 版本: 2.2.10

执行模式（静态图/动态图）： 不限

Python 版本: 3.8

操作系统平台: linux

**2. 报错信息**

2.1 问题描述

当

2.2 报错信息

```
RuntimeError: For 'Conv2D', 'C_in' of input 'x' shape divide by parameter 'group' must be equal to 'C_in' of input 'weight' shape: 1, but got 'C_in' of input 'x' shape: 3, and 'group': 1.
```

2.3 脚本信息

```
class LeNet5(nn.Cell):
    """
    LeNet-5网络结构
    """
    def __init__(self, num_class=10, num_channel=1):
        super(LeNet5, self).__init__()
        # 卷积层，输入的通道数为num_channel，输出的通道数为6，卷积核大小为5*5
        self.conv1 = nn.Conv2d(num_channel, 6, 5, pad_mode='valid')
        # 卷积层，输入的通道数为6，输出的通道数为16，卷积核大小为5*5
        self.conv2 = nn.Conv2d(6, 16, 5, pad_mode='valid')
        # 全连接层，输入个数为16*5*5，输出个数为120
        self.fc1 = nn.Dense(16 * 5 * 5, 120)
        # 全连接层，输入个数为120，输出个数为84
        self.fc2 = nn.Dense(120, 84)
        # 全连接层，输入个数为84，分类的个数为num_class
        self.fc3 = nn.Dense(84, num_class)
        # ReLU激活函数
        self.relu = nn.ReLU()
        self.relu2 = vmap(nn.ReLU(), in_axes=0, out_axes=0)
        # 池化层
        self.max_pool2d = nn.MaxPool2d(kernel_size=2, stride=2)
        # 多维数组展平为一维数组
        self.flatten = nn.Flatten()

    def construct(self, x):
        # 使用定义好的运算构建前向网络
        x = self.conv1(x)
        x = self.relu(x)
        x = self.max_pool2d(x)

        x = self.conv2(x)
        x = self.relu(x)
        x = self.max_pool2d(x)
        x = self.flatten(x)
        x = self.fc1(x)
        x = self.relu(x)
        x = self.fc2(x)
        x = self.relu(x)
        x = self.fc3(x)
        x = self.relu2(x)
        return x

network = LeNet5(num_class=36)

# 定义完网络后就是定义损失函数。
net_loss = nn.SoftmaxCrossEntropyWithLogits(sparse=True, reduction='mean')

# 然后定义优化器函数。
net_opt = nn.Momentum(network.trainable_params(), learning_rate=0.01, momentum=0.9)

# 设置模型保存参数，模型训练保存参数的step为1875。
config_ck = CheckpointConfig(save_checkpoint_steps=1875, keep_checkpoint_max=10)

# 应用模型保存参数。
ckpoint = ModelCheckpoint(prefix="lenet", directory="./test", config=config_ck)

# 然后就是初始化模型参数。
model = ms.Model(network, loss_fn=net_loss, optimizer=net_opt, metrics={'accuracy'})

# 最后一步就是训练网络模型，并保存为lenet-1_1875.ckpt文件
model.train(30, dataset_train, callbacks=[ckpoint, LossMonitor(0.01, 1875)])
```

**3. 根因分析**

大概意思是x的C\_in的shape 除参数group应该等于输入weight的C\_in的shape 1，但是实际输入x的C\_in 的shape 3，group 1，两者相除等于3，就和weight的shape 1不一致了。

![](figures/zh-cn_image_0000002143266485.png)输入Tensor的shape为 \(N,Cin,Hin,Win\)

self.conv1 = nn.Conv2d\(num\_channel, 6, 5, pad\_mode='valid'\)

![](figures/zh-cn_image_0000002107628766.png)

在conv1前面加打印，打印输入的shape\(32, 3, 32, 32\)，输入的C\_in是3，num\_channel=1，这个就是不一致的地方了。

**4. 解决方案**

修改网络的num\_channel。

```
def __init__(self, num_class=10, num_channel=3):
```

修改之后就能正常跑下去了。

