paddle飞浆7天打卡营心得
- 使用paddle用于深度学习
- paddle的安装
- 打卡营学习内容
- 每日学习具体内容的总结
- 总结
1、 使用paddle用于深度学习
近期有幸参加paddle飞浆的7天免费打卡营活动,对于深度学习比较小白的人来说,无疑是最好的选择。关于本篇心得所有的资源都可以在百度AI stidio中获得。
跟其他的深度学习框架相比,飞浆具有五大领先优势:
1)业界主流的编程方案;
2)产业级的官方开源模型库;
3)超大规模的分布式模型训练;
4)多端多平台的应用部署;
5)系统化的深度学习服务平台
这些优势说起来可能没什么体会,只有当自己用起来才能知道飞浆的便利。
2、paddle的安装
在安装paddle时,根据自己计算机的系统类型,安装方式,硬件平台等选择适合自己的安装命令。本人计算机是win7的64位操作系统,python版本是3.7,因此在选择安装paddle,可以按下图方式选择
然后执行以下命令进行安装,推荐最好使用百度源
python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
安装完成后,可以使用pip list查看计算机中是否安装成功
3、打卡营学习内容
day1: 新冠疫情可视化
day2: 手势识别
day3: 车牌识别
day4: 口罩分类
day5: 人流检测分类比赛和paddlehub体验
day6: paddleslim介绍与使用
4、每日学习具体内容的总结
day1: 新冠疫情可视化
作业内容是根据课上所学内容,爬取3月31日当天丁香园的统计数据,根据累计确诊数,使用pyecharts绘制疫情分布图。
代码如下:
import json
import datetime
from pyecharts import options as opts
from pyecharts.charts import Pie
from pyecharts.faker import Faker
# 读原始数据文件
today = datetime.date.today().strftime('%Y%m%d')
datafile = 'data/'+ today + '.json'
with open(datafile, 'r', encoding='UTF-8') as file:
json_array = json.loads(file.read())
# 分析全国实时确诊数据:'confirmedCount'字段
china_data = []
for province in json_array:
china_data.append((province['provinceShortName'], province['confirmedCount']))
china_data = sorted(china_data, key=lambda x: x[1], reverse=True) #reverse=True,表示降序,反之升序
print(china_data)
# 全国疫情地图
# 自定义的每一段的范围,以及每一段的特别的样式。
labels = [data[0] for data in china_data]
counts = [data[1] for data in china_data]
c = Pie()
c.add("累计确诊", [list(z) for z in zip(labels, counts)], center=["40%","70%"])
#系列配置项,可配置图元样式、文字样式、标签样式、点线样式等
c.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
#全局配置项,可配置标题、动画、坐标轴、图例等
c.set_global_opts(title_opts=opts.TitleOpts(title='全国实时确诊数据饼图',
subtitle='数据来源:丁香园'),
legend_opts=opts.LegendOpts(type_="scroll", pos_left="70%", orient="vertical"),
) #是否显示视觉映射配置
#render()会生成本地 HTML 文件,默认会在当前目录生成 render.html 文件,也可以传入路径参数,如 c.render("mycharts.html")
c.render(path='/home/aistudio/data/全国实时确诊数据饼图.html')
这部分代码跟课上所讲的全国疫情地图相似,用到的数据都是一样的,不一样的是课上讲的示例是在地图中表示出全国每个省份疫情的具体人数,而作业是要用饼图表示。因此,可以把参照课上示例进行改写。具体关于饼图的实现,可以查看Pyecharts API
day2: 手势识别
作业任务是补全代码并成功运行,调参数、优化,提高测试集准备率
学习的主要内容是使用深度学习解决图像识别,学习过程是首先要确定函数集合,其次怎样评价好坏,最后挑出最好函数。用深度学习的逻辑来说,则是建立模型->损失函数->参数学习,如下图所示:
以下为部分代码:
#定义DNN网络
class MyDNN(fluid.dygraph.Layer):
def __init__(self):
super(MyDNN,self).__init__()
self.hidden1 = Linear(100,200,act='relu')
self.hidden2 = Linear(200,200,act='relu')
self.hidden3 = Linear(200,200,act='relu')
self.hidden4 = Linear(200,100,act='relu')
self.hidden5 = Linear(3*100*100,10,act='softmax')
def forward(self,input):
x=self.hidden1(input)
x=self.hidden2(x)
x=self.hidden3(x)
x=self.layers.dropout(x,dropout_prob=0.4)
x=self.hidden4(x)
x=fluid.layers.dropout(x,dropout_prob=0.4)
x=fluid.layers.reshape(x,shape=[-1,3*100*100])
y=self.hidden5(x)
return y
使用的是深度学习中最经典,相对较为简单的深度神经网络。为了提高运行结果的准确率,可以增加迭代次数,增加dropout以及调节学习率和优化器。
day3: 车牌识别
作业任务依旧是补全代码
对于这个问题,如果还是使用深度神经网络,得到的结果可能差强人意,因此需要引入其他神经网络。其中CNN,是深度学习卷积神经网络中的经典网络。
卷积神经网络在结构上具有三大特性:局部连接、权重共享、下采样,结构如下:
对卷积神经网络中最具代表性的模型之一,LeNet-5模型进行解析,模型分为多个卷积层、激活层、池化层,然后是全连接层,最后通过softmax函数将各个分类标签通过概率表示出来。
以下是部分代码:
#定义网络
class MyLeNet(fluid.dygraph.Layer):
def __init__(self):
super(MyLeNet,self).__init__()
self.hidden1_1 = Conv2D(1,28,5,1)
self.hidden1_2 = Pool2D(pool_size=2,pool_type='max',pool_stride=1)
self.hidden2_1 = Conv2D(28,32,3,1)
self.hidden2_2 = Pool2D(pool_size=2,pool_type='max',pool_stride=1)
self.hidden3 = Conv2D(32,32,3,1)
self.hidden4 = Linear(32*10*10,65,act='softmax')
def forward(self,input):
x=self.hidden1_1(input)
x=self.hidden1_2(x)
x=self.hidden2_1(x)
x=self.hidden2_2(x)
x=self.hidden3(x)
x=fluid.layers.dropout(x,dropout_prob=0.4)
x=fluid.layers.reshape(x,shape=[-1,32*10*10])
y=self.hidden4(x)
return y
车牌识别需要事先将每个字符切分出来,总共形成65个分类,再通过深度学习最后预测的车牌上每个字符最大概率的预测字符,再将预测的字符凭借起来形成最终的识别结果。
day4: 口罩分类
作业任务:在 VGGNet类中补全代码,构造VGG网络,保证程序跑通。在VGG构造成功的基础上,可尝试构造其他网络,思考并动手进行调优。
口罩识别,是指可以有效的检测在密集人流区域中携带和未携带口罩的所有人连,同时判断该者是否佩戴口罩。通常由两个功能单元组成,可以分别完成口罩人脸的检测和口罩人脸的分类。
课中介绍了计算机视觉四种主要任务,分别是:
1)图像分类:为图像赋予一个或多个语义标签
2)目标检测:找到图像中物体的类别即所在位置
3)图像语义分割:找到图像中物体的类别并精确勾勒出其所在位置
4)图像实例分割:多个同类物体存在时,将它们一一区分出来
课中还介绍了四种经典CNN结构,AlexNet、VGG、GoogLeNet/Inception、ResNet。在这里就不一一介绍了,主要介绍一下用于这个问题的VGG结构。
由上图可以看出VGG网络最多可以有19层,模型拥有多个卷积层、激活层、池化层,全连接层。
以下部分代码:
class VGGNet(fluid.dygraph.Layer):
'''
VGG网络
'''
def __init__(self):
super(VGGNet, self).__init__()
self.convpool01=ConvPool(3,64,3,2,2,2,act='relu')
self.convpool02=ConvPool(64,128,3,2,2,2,act='relu')
self.convpool03=ConvPool(128,256,3,2,2,2,act='relu')
self.convpool04=ConvPool(256,512,3,2,2,2,act='relu')
self.convpool05=ConvPool(512,512,3,2,2,3,act='relu')
self.pool_5_shape=512*5*5
self.fc01=fluid.dygraph.Linear(self.pool_5_shape,4096,act='relu')
self.fc02=fluid.dygraph.Linear(4096,4096,act='relu')
self.fc03=fluid.dygraph.Linear(4096,2,act='softmax')
def forward(self, inputs, label=None):
print(inputs.shape)
"""前向计算"""
out=self.convpool01(inputs)
out=self.convpool02(out)
out=self.convpool03(out)
out=self.convpool04(out)
out=self.convpool05(out)
out=fluid.layers.reshape(out,shape=[-1,512*5*5])
out=self.fc01(out)
out=fluid.layers.dropout(out,dropout_prob=0.4)
out=self.fc02(out)
out=fluid.layers.dropout(out,dropout_prob=0.4)
out=self.fc03(out)
if label is not None:
acc=fluid.layers.accuracy(input=out,label=label)
return out,acc
else:
return out
在进行口罩分类时,因为得到的数据集较少,很容易出现过拟合的问题,所以,可以通过添加数据增强的方式,提高得到结果的准确率。
day5: 人流检测分类和paddlehub体验
比赛内容:以人流密度估计作为内容,答题者需要以对应主题作为技术核心,开发出能适用于密集、稀疏、高空、车载等多种复杂场景的通用人流密度估计算法,准确估计出输入图像中的总人数。
paddlehub是飞浆预训练模型管理和迁移学习工具,通过paddlehub,可以使用高质量的预训练模型结合Fine-tune API快速完成迁移学习到应用部署的全流程工作。
paddlehub包括了一下各种主流模型:
更多关于paddlehub的模型可查看https://github.com/PaddlePaddle/PaddleHub
此次比赛使用的训练和测试图片都来自一般监控场景,但是包括了多种视角,因此途中行人的大小,形状都有所差异。
在编写这次比赛代码时,可以从不同角度思考人流密度检测问题,一是可以将其看作是一个分类问题,即人类为一类,其他物件为另一类,二是可以看成是一个回归问题,三是可以看成是一个目标检测问题。
这里,将人流密度问题看成是一个普通的目标检测问题,使用VGG网络,以下是模型部分代码:
def dilations_cnn(VGG_16_net):
x = VGG_16_net
print(x.shape)
x = fluid.layers.conv2d(input=x, num_filters=512, filter_size=3, padding=2, dilation=2, act='relu')
x = fluid.layers.dropout(x=x, dropout_prob=0.5)
x = fluid.layers.conv2d(input=x, num_filters=512, filter_size=3, padding=2, dilation=2, act='relu')
x = fluid.layers.dropout(x=x, dropout_prob=0.5)
x = fluid.layers.conv2d(input=x, num_filters=512, filter_size=3, padding=2, dilation=2, act='relu')
x = fluid.layers.dropout(x=x, dropout_prob=0.5)
x = fluid.layers.conv2d(input=x, num_filters=256, filter_size=3, padding=2, dilation=2, act='relu')
x = fluid.layers.dropout(x=x, dropout_prob=0.5)
x = fluid.layers.conv2d(input=x, num_filters=128, filter_size=3, padding=2, dilation=2, act='relu')
x = fluid.layers.dropout(x=x, dropout_prob=0.5)
x = fluid.layers.conv2d(input=x, num_filters=64, filter_size=3, padding=2, dilation=2, act='relu')
x = fluid.layers.conv2d(input=x, num_filters=1, filter_size=1, act=None)
print(x.shape)
return x
day6: paddleslim介绍与使用
paddleslim是一个模型压缩工具集,产出好用的“小模型”。小模型的好处就是运行时显存/内存占用变小,计算量减少、延时变小、QPS增大,还可以移动端及嵌入式端部署。
paddleslim通过剪裁、量化、蒸馏、nas(Network Architecture Search)等压缩方法,使模型小型化。具体内容如图所示:
在实际操作时,可以将4个方法叠加使用,例如先剪裁再蒸馏后量化。使用这些方法之后在分类、检测、分割等任务都取得不错的效果。具体操作可查看百度Ai studio中的图像分类模型通道剪裁
paddleLite是一个面向AI应用部署的轻量级推理引擎。应用如图:
paddleslim的压缩模型可以使用paddleLite部署预测。
5、 总结
- 深度学习就是通过数据处理,模型设计,训练配置,训练过程,保存/加载,最后得出想要的结论的过程,利用paddle飞浆框架编写运行使得这个过程更加简单。
- 在训练模型的过程中经常会遇到梯度消失和梯度截断,过拟合等问题。
1)当遇到梯度消失或梯度截断的问题时,可以利用更换激活函数、增加ResNet block和batch normalization,预训练+微调等方法进行优化;
2)当出现过拟合问题时,可以利用数据增强、提前停止、权重正则化、添加dropout等方法避免过拟合;
3)还可以使用其他方法优化模型,例如调节学习率,batchsize或是优化函数。 - 通过在百度飞浆7天打卡营一个星期的学习,不管是理论还是实践都有所提高,希望后期还能参加飞浆的其他打卡营活动,尤其是CV论文复现打卡营(▽)!