深度学习七日入门体验-PaddlePaddle

    疫情期间在家闲着没事,想学一些CV方面的知识。之前学了七月在线的一个CV课和一个DL课程,但是都是去年的录屏视频了。不得不说课非常良心,讲的都是干货,学完之后我对CV知识有了初步的了解,但也不深,尤其是代码方面因为课程里不是边写边讲,也没人讨论,还是云里雾里的。刚好七月的课结束了看到百度的的七日入门深度学习就去参加了。百度的课程免费(更加良心),每天以直播的形式教学,每天有理论知识讲解和现场撸代码,群里助教回复的都很及时,给的建议也都很有效,即使问的很低级的问题大家也不会嘲笑你,终于七天的学习结束了,收获挺多,做个总结。

    总的来说讲的知识比较基础,因为面向基础班嘛也不能讲的太深。虽然很基础但是一点也不水,包含了数据可视化,DNN,CNN,经典卷积网络样例复现,调优,物体检测,网络模型压缩,迁移学习等技术。

    第一天讲的AI的基本知识,介绍了AI,ML,DL的关系,CV的四大任务,还有一些宏观知识。实践部分是完成paddle飞桨的安装以及用pyecharts绘制疫情可视化数据图。paddle是一个框架,我理解为和tensorflow,pytorch一个层面的东西,挺好用的。echarts做前端工作或者数据可视化的应该都很熟了,在这方面百度的的确确可以算是全国第一了,方便好用美观功能强大都做到了。pyecharts和echarts的区别在于pyecharts将python和echarts结合,如果你习惯python语言的话就无需切换语言可以直接上手了,对于AI人员来说更加友好。做的内容是全国疫情实时情况饼状图,之前给了全国地图和湖北地图的示例,不难。

  第二天内容是讲解神经网络,DNN的搭建以及应用DNN给手写数字分类,手写数字分类可以说是每个CV入门的第一第二个必写程序了。从数据集中训练集和测试集如何处理,网络模型搭建,优化器,网络训练,loss函数等各个方面都解释了一遍,加深认识。

  第三天讲的是CNN卷积神经网络,在图像处理中运用DNN的话参数量太大,计算多,CNN应运而生。CNN相较于一般的神经网络其特点在于1.由全连接改成局部连接 2.(权值)参数共享 还有下采样pooling也是CNN降低参数量的一个创新。之前我看的其他的课程就对12这两个知识点不太清楚,花了好长时间找了各种资料也半懂不懂(可能我反应太慢了),直到看到这个ppt和老师的讲解,有如醍醐灌顶。

深度学习七日入门体验-PaddlePaddle_第1张图片深度学习七日入门体验-PaddlePaddle_第2张图片

之前还有一个不清楚的地方在于不同的地方,各类专业名词不同老师说的都不同,所以我很混乱,比如卷积壳(上图中2*2的权值矩阵 还要乘上通道数)也叫Kernel,但是他也可以被叫做卷积模板,卷积算子,还有老师叫他slide window滑窗。卷积出来的结果是featureMap特征图,每个卷积壳卷积完当前的输入图(上一层结果的featureMap)都会产生一个featureMap,这个featureMap可以理解为当前输入图像(也可能是上一层输出的featureMap)在这个Kernel特征上的相似度,举个不一定恰当的例子,假如这个kernel是描述喉结的,卷积完之后的featureMap有一个区域数字很大,说明这个图像在该区域喉结这个特征比较相符,另外一个Kernel是描述头发的,卷积完也会产生一个featureMap,那么每个kernel都可以在对于的维度产生一个特征描述。一定程度上kernel越多,特征就越多,越能判断出这个图像属于什么分类。对头发这个特征细分下去又可以有颜色,长短,是否弯曲等下个维度的很多个特征,这也是为什么卷积层经常会不止有一层,因为我们需要在一定程度上得到较为细致的特征描述组合才能准确分类。 经过一个conv卷积层的output输出是有多个featureMap叠加而成的,像汉堡包一样一层一层累加,可以理解为在这个(卷积)层面上输入数据和kenerl各个特征的相似度,如在眼耳口鼻喉这几个特征上原图和这几个Kernel的相似度是多少,下一层再继续抽象,又会产生很多个featureMap,人为可能较难以理解这些特征了,但是机器可以理解。Kernel可以理解成这个网络模型里的价值观,我们需要一个比较好的价值观来作为标准给输入的人或物分类(数据),所以会采用一定的策略(比如BP反向传播)不断更新这个世界观W。这个世界观是不是足够好,可以用loss函数来很明显地体现,我们希望这个网络里的世界观尽可能和真实世界观相似/近,即loss值尽可能小,而loss在梯度方向减少,所以常用梯度下降GD来做优化参数。我们的目的就是得到好的卷积壳W以便于每层卷积后的结果特征图可以很好地描述我的目标特征,从而使得输入一张图片就能判断他的分类。

     实践代码中第四天做的是用CNN做车牌识别,难点在于文字比如江浙沪,单词ABC,数字三个都有。

  第四天讲的是经典CNN网络,理论课讲的是AlexNet,AlexNet(八层结构)的突破点在于(relu 数据增强 Dropout提升泛化能力 batchSize=128批训练 带动量的SGD) 

  实践课写的代码是VGG框架为基础做口罩人脸识别。没什么特别的,只是卷积层的参数方面需要注意点,很容易会不匹配报错。VGG是五层卷积池化层,两个全连接接一个softmax二分类,调整学习率0.001,优化器从Adam改成了SGD(adam收敛不好),轮数50轮,训练后在测试集跑准确率可以到百分之97以上。

常见的参数调优技巧:
1.数据增强 亮度 旋转 拉伸 镜像之类的 AlexNet之后一直在用(GitHub上有个大神做好的)
2.如果训练集和测试集准确率都不够 可能是网络结构问题 可以考虑
1.把网络加深(增加层数)加宽(增加每次神经元个数)
2.预训练模型 在ImageNet数据集上通过强大算力得到一个比较好的权重初始化 再来训练我们的网络 把我们的小数据集扔上上去
3.过拟合 训练集准确率远高于测试集 模型泛化能力不强
1.early stop技巧 训练得过头了 可以在训练网络比如达到三次百分之90以上就停止训练
2.权重正则化 批归一化bn  dropOut=0.5设置
3.超参数 学习率=0.001 轮数epoch 优化器SGD还是Adam(loss可以迅速下降 但是对数据量比较大的不友好)还是带momentum动量的SGD(适合大规模数据量)

第五天清明休息 最后的是是PaddleHub和PaddleSlim两个工具的介绍。PaddleHub是做预训练模型的,可以让我们的小规模任务也可以用复杂网络达到一个比较好的效果,用来做迁移学习也很棒。PaddleSlim是做模型压缩的,非常实用,随着任务难度和精度的要求不断提升,网络也变得越来越复杂,因为一般来说复杂的网络精度更好,但是我们想要小容量,效率高又精度高的网络,这样应用场景可以扩大很多,也会给人类生活带来很多进步,这是模型压缩或者说PaddleSilm产生的背景。模型压缩主要可以从四个方面来着手:1.裁剪(通道) 2量化 3.蒸馏 4.NAS 

裁剪是解决模型容量问题,将不重要的通道裁剪,在只降低一定范围的模型精度的情况下(如果本身网络容易过拟合甚至可以提升精度)大大减小模型的参数量,从而减少运算,提升运算效率。

量化是将float32映射到nt8存储,减小模型体积和运算量,提升运算效率。

蒸馏是通过老师模型指导学生模型(类似迁移学习),将大模型的知识迁移到小模型上,来提升小模型精度。

NAS(模型结构搜索)是以模型大小和推理速度为约束筛选出符合条件的网络模型,以便设计更高效的网络模型结构。

实践方面老师手动带我们写了怎么一步步做裁剪,最后我们自己做了下量化。

最后我还参加了人流检测的竞赛,挑战很大。老师提供了三个思路。1.将人流问题看成是一个最大分类问题,以一张图片中可能出现的最大人数为分类数分类,将相同人数的图片归为一类。但是这对大人数场景不友好。2.是讲它看成是一个回归问题,输入图片,输出图片映射的人物数量。3.是热力图的方案,最后我采取的也是这一方案,竞赛挑战太大了,目前还是需要把这几天学到的知识再吃吃透在考虑进阶。

以上就是我的记录和分享。

你可能感兴趣的:(DL,CV,PaddlePaddle)