整理自己第一次训练CNN踩的坑

       最近在训练单字分类器,因为类别数太多,想着先拿10个类看看网络效果。结果一测准确率86%,看起来还行。但是!当类别数变成7356的时候,准确率只有0.2%,训练集上的损失也是不下降,一直震荡;再一看测试集人就傻了,损失直接拉到2000多(我:????)

        经过好几天的调试,发现了几个容易踩坑的地方,发出来记录一下。

①归一化的方法

data1 = transforms.Resize((64, 64))


data2 = transforms.RandomResizedCrop((64, 64))

其中Resize才是将图像归一化到统一尺寸!RandomResizedCrop是随机采样后将图像裁剪到统一尺寸。具体效果看图。

整理自己第一次训练CNN踩的坑_第1张图片

         其中每行的第一幅都是未归一化的图像,第二幅是我们需要的归一化到64*64的图像。图三是RandomResizedCrop得到的图像。

        根据图像很清晰地看到,如果我们使用RandomResizedCrop函数,网络和我们都不知道我们搞了个啥玩意出来。

②model.train()和model.eval()

        在官方文档中 model.train()的作用是保证 Batch Normalizatiom 和 Dropout 被启
用。 
        model.eval()的作用是不启用 Batch Normalization 和 Dropout。若在测试前不加入
mode.eval(),会导致测试过程中也改变网络的权值。 
        根据个人实验结果发现,若在训练过程中缺少 model.train()语句,准确率会下降至
50%左右。 

③scheduler.step()的位置

        一开始,我将scheduler.step()直接写到了梯度回传的后面,导致收敛速度极其慢甚至不收敛。后面想了一下,个人分析是如果在每次梯度回传后更新学习率,会导致收敛步长越来越小以至于不收敛。

④注意数据的转换

        第一次训练网络的时候,只将images转换成了tensor,没有将labels转换。后面直接将两个全转换成tensor了。因为没有做具体实验和分析。不好确定影响程度。希望有大佬说一下影响。

总结一下,个人第一次搭建网络和训练框架,感觉有很多细微的地方都没注意到,开组会还被怼(正经人谁不被怼啊)但是最终结果上升到95%还是很开心的。这也是我正式迈入Ai邻域的一个象征吧。

你可能感兴趣的:(cnn,人工智能,神经网络)