# 训练过程中推理精度不变问题定位思路

**1. 系统环境**

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

软件环境: MindSpore 版本: 1.8.0

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

Python 版本: 3.7.5

操作系统平台: linux

**2. 报错信息**

网络边训练边推理，每进行一个epoch进行一次推理，推理的精度总是不变。

**3. 根因分析**

1. 每个epoch都保存了ckpt，load ckpt查看参数，每个参数都变了，说明参数是正常更新的；

2. 怀疑是不是eval有问题，使用pth转的ckpt做推理，精度差不多，说明前向和推理有问题可能性不大；

3. 怀疑是不是函数式的写法还未支持完善，改为model.train形式实验，发现loss变化趋势差不多，排除；

4. 打印eval的时候前向结果，这是个三分类网络，发现前向结果均为2，怀疑很大可能是训练不好导致的；

5. 要到torch脚本，先排查loss函数，优化器和学习率，是对应的；对比参数初始化方法，代码上思路相同；打印参数初始化方法中的param name，发现原意为筛调预训练模型bert的param不初始化，但实际代码中虽然做了筛选，但后面直接使用了self.parameter获取了所有的param，应改为cell.parameter" 。

**4. 解决方案**

最后发现出现问题的代码是：

```
for cell in self.cells(): 
    if type(cell) != BertModel: 
        for param in self.get_parameter: 
            xxxxx
```

self.get\_parameter获取了整个网络的parameter，而不是cell的parameter。

