深度学习7日入门-百度PaddlePaddle框架学习小结

Posted DevDog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深度学习7日入门-百度PaddlePaddle框架学习小结相关的知识,希望对你有一定的参考价值。


近日参加了百度开设的基于PaddlePaddle飞桨的深度学习7日入门-CV疫情特辑学习营,通过连续紧张的几个晚上的直播、作业和比赛深刻理解了深度学习、神经网络、卷积神经等概念,也在AI Studio上进行了利用PaddlePaddle框架照搭建网络和参数调优等代码实现,参加了实战比赛,当前最好成绩排名57/324,学习过程中收获很大。话不多说,先说感受:深度学习是有套路的,这个套路就是按照数据处理--模型设计--训练配置--训练过程--保存/加载这样的步骤,在百度PaddlePaddle飞浆框架的加持下一切变得很简单(百度,打钱!)。嗯,不骗你,确实只要零基础/7日就可以上手深度学习。再来看下课程描述,猛击文末阅读原文直达课程链接:






- 深度学习7日入门-CV特辑 -

基于PaddlePaddle飞桨框架




Day1 新冠疫情可视化



理论:图像识别与人工智能

实践:新冠疫情可视化

最近几年,人工智能、机器学习以及深度学习等概念十分火爆。我们需要理解这几个看似相同又有差异的概念。人工智能是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的科学。机器学习是专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识和技能。而深度学习和机器学习的理论结构是一致的,最根本的差别在于假设的复杂度上。


深度学习7日入门-百度PaddlePaddle框架学习小结

仰望这些大师们!


深度学习7日入门-百度PaddlePaddle框架学习小结


课外作业是安装百度PaddlePaddle飞桨环境,以及利用Python爬取丁香园疫情数据并利用PyEcharts进行展示。这个还好,有点Python基础+翻阅下PyEcharts API完成。PyEcharts看起来还不错,配置项好强大!


#饼图c = ( Pie() .add( "", [list(z) for z in zip(labels, counts)], center=["50%", "70%"], radius=["2%","50%"], ) .set_global_opts( title_opts=opts.TitleOpts(title="全国实时确诊数据("+today+")"), legend_opts=opts.LegendOpts(is_show=False), ) .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}")) .render("/home/aistudio/data/全国实时确诊数据饼图.html"))


作业展示

深度学习7日入门-百度PaddlePaddle框架学习小结




Day2 手势识别



今天学习的是深度学习与图像识别、深度学习解析三部曲,然后通过代码完成利用图片分类来进行手势识别。


深度学习7日入门-百度PaddlePaddle框架学习小结


通过建立模型,选择合适的损失函数,参数学习的三部曲,解决图像识别问题。

深度学习7日入门-百度PaddlePaddle框架学习小结


#定义DNN网络class MyDNN(fluid.dygraph.Layer): def __init__(self): super(MyDNN,self).__init__() self.hidden1 = Linear(100,100,act='relu') self.hidden2 = Linear(100,100,act='relu') self.hidden3 = Linear(100,100,act='relu') self.hidden4 = Linear(3*100*100,10,act='softmax') def forward(self,inputs): #print('input shape:',inputs.shape) x = self.hidden1(inputs) #print('x shape:',x.shape) x = self.hidden2(x) #print('x shape:',x.shape) x = self.hidden3(x) #print('x shape:',x.shape) x = fluid.layers.reshape(x,shape=[-1,3*100*100]) #print('x shape:',x.shape) y = self.hidden4(x) #print('y shape:',y.shape)  return y
#用动态图进行训练with fluid.dygraph.guard(): model=MyDNN() #模型实例化 model.train() #训练模式 #SGDOptimizer效果理想 #opt=fluid.optimizer.SGDOptimizer(learning_rate=0.01, parameter_list=model.parameters())#优化器选用SGD随机梯度下降,学习率为0.001. #MomentumOptimizer效果不理想 #opt=fluid.optimizer.MomentumOptimizer(learning_rate=0.1, momentum=0.3, parameter_list=model.parameters()) #AdagradOptimizer效果理想 opt = fluid.optimizer.AdagradOptimizer(learning_rate=0.01, epsilon=1e-06, parameter_list=model.parameters(), regularization=None, name=None, initial_accumulator_value=0.0) #DecayedAdagradOptimizer效果不理想 #opt = fluid.optimizer.DecayedAdagradOptimizer(learning_rate=0.01, decay=0.95, epsilon=1e-06, parameter_list=model.parameters(), regularization=None, name=None) #DpsgdOptimizer效果不理想 #opt = fluid.optimizer.DpsgdOptimizer(learning_rate=0.01, clip=0.9, batch_size=0.999, sigma=1e-8, parameter_list=model.parameters()) epochs_num=200 #迭代次数 for pass_num in range(epochs_num): for batch_id,data in enumerate(train_reader()): images=np.array([x[0].reshape(3,100,100) for x in data],np.float32) #.reshape(-1, 1, 100, 100) labels = np.array([x[1] for x in data]).astype('int64') #.reshape(-1, 1)
labels = labels[:, np.newaxis] # print(images.shape)
image=fluid.dygraph.to_variable(images) label=fluid.dygraph.to_variable(labels)
#预测 计算模型输出 predict=model(image) # print(predict)
# 计算损失函数 loss=fluid.layers.cross_entropy(predict,label) avg_loss=fluid.layers.mean(loss)#获取loss值 # 计算损失函数 #loss = fluid.layers.softmax_with_cross_entropy(predict, label) #avg_loss = fluid.layers.mean(loss)
#计算精度 acc=fluid.layers.accuracy(predict,label) #输出精度 if batch_id!=0 and batch_id%50==0: print("train_pass:{},batch_id:{},train_loss:{},train_acc:{}".format(pass_num,batch_id,avg_loss.numpy(),acc.numpy())) avg_loss.backward() opt.minimize(avg_loss) model.clear_gradients() fluid.save_dygraph(model.state_dict(),'MyDNN')#保存模型
#读取预测图像,进行预测def load_image(path): img = Image.open(path) img = img.resize((100, 100), Image.ANTIALIAS) img = np.array(img).astype('float32') img = img.transpose((2, 0, 1)) img = img/255.0 print(img.shape) return img
#构建预测动态图过程with fluid.dygraph.guard(): infer_path = '手势.JPG' model=MyDNN()#模型实例化 model_dict,_=fluid.load_dygraph('MyDNN') model.load_dict(model_dict)#加载模型参数 model.eval()#评估模式 infer_img = load_image(infer_path) infer_img=np.array(infer_img).astype('float32') infer_img=infer_img[np.newaxis,:, : ,:] infer_img = fluid.dygraph.to_variable(infer_img) result=model(infer_img) display(Image.open('手势.JPG')) print(np.argmax(result.numpy()))

以上为部分代码,期间通过查看Paddle API,添加了几种不同的优化器各种尝试,查看损失率和准确率再确定最好的参数。需要说明的是,某个优化器尝试下来效果不理想,或许是其中参数选的不够好(其实是如何选取参数还没概念!)


深度学习7日入门-百度PaddlePaddle框架学习小结

测试集中图片的预测结果,嗯,干得不错,这个手势确实是5。





Day3 车牌识别



这个和口罩识别一样是属于疫情期间的大招,识别湖北车牌?

理论上讲解全连接神经网络问题和卷积神经网络,然后通过车牌识别实际搭建卷积神经网络进行车牌识别训练。


深度学习7日入门-百度PaddlePaddle框架学习小结


通过对经典的卷积网络模型比如LeNet的解析, 分为多个卷积层,激活层,池化层,然后是全连接层,最后通过Softmax函数将各分类标签通过概率表达出来。


车牌识别中,需要事先将车牌中每个字符例如'沪','C'等切分出来,共形成65个分类,通过深度学习实际上最后预测的是车牌上的每个字符最大概率的预测字符,然后再拼接出来形成最终的识别结果。


#定义网络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,inputs): y = self.hidden1_1(inputs) #print('shape after hidden1_1:', y.shape) y = self.hidden1_2(y) #print('shape after hidden1_2:', y.shape) y = self.hidden2_1(y) #print('shape after hidden2_1:', y.shape) y = self.hidden2_2(y) #print('shape after hidden2_2:', y.shape) y = self.hidden3(y) #print('shape after hidden3:', y.shape) y= fluid.layers.reshape(y,shape=[-1,32*10*10]) #print('reshape after hidden3:', y.shape) y = self.hidden4(y) #print('shape after hidden4:', y.shape)
return y

深度学习7日入门-百度PaddlePaddle框架学习小结

模型平均准确率可以达到0.9800635后没再继续了,交作业!


深度学习7日入门-百度PaddlePaddle框架学习小结

测试集上的一张车牌照片,识别正常。



Day4 口罩分类



理论部分讲解经典卷积神经网络结构,再以口罩分类作为实战练习。

计算机视觉由粗粒度到细粒度的四种主要任务:图像分类,目标检测,图像语义分隔和图像实体分隔,其中图像语义分隔是指识别物体类别并精确勾勒所在位置,而图像实体分隔是指多个同类物体存在时需要精确区分出来包括部分遮挡物体。

本节介绍了数据集CIFAR-10,然后分别介绍了几个经典的卷积神经网络,例如ImageNet, AlexNet, VGG, GoogleNet,ResNet等。


深度学习7日入门-百度PaddlePaddle框架学习小结


放一张ResNet网络图,好复杂!

深度学习7日入门-百度PaddlePaddle框架学习小结


口罩分类实战中搭建VGG神经网络,按照戴口罩和不戴口罩做图片分类训练。以下为作业中VGG网络截图:

深度学习7日入门-百度PaddlePaddle框架学习小结


深度学习7日入门-百度PaddlePaddle框架学习小结

训练损失率和准确率图


深度学习7日入门-百度PaddlePaddle框架学习小结

预测结果:戴口罩




Day5 比赛发布及PaddleHub体验



发布比赛内容及比赛用数据集。比赛要求给出一个算法或模型,对于给定的图片,统计图片中的总人数。给定图片数据,选手据此训练模型,为每张测试数据预测出最准确的人数。结果以图片文件名和预测出的人数为记录形成一个csv文件,然后上传该csv文件,后台统计出每张图片的错误率,再求出整体错误率,然后根据错误率排名


PddleHub是飞桨预训练模型管理与迁移学习工具,通过PaddleHub开发者可以使用高质量的预训练模型结合Fine-tune API快速完成迁移学习到应用部署的全流程工作。它涵盖了图像分类、目标检测、词法分析、语义模型、情感分析、视频分类、图像生成、图像分隔、文本审核、关键点检测等主流模型。更多PaddleHub已经发布的模型可以在https://www.paddlepaddle.org.cn/hub查看,比如口罩人脸检测,肺炎CT分析等。


一些基础课程也放到此课节内,比如深度学习概念,必备数学知识,Python快速入门,PaddlePaddle快速入门,Notebook基本操作等,这些其实没什么,就是看到数学知识里面微分积分及矩阵向量有点眼晕(再论基础知识在深度学习中的重要性)。


深度学习7日入门-百度PaddlePaddle框架学习小结


本次比赛所用训练和测试图片均来自一般监控场景,但包括多种视角(如低空、高空、鱼眼等),图中行人的相对尺寸也会有较大差异。部分训练数据参考了公开数据集(如ShanghaiTech [1], UCF-CC-50 [2], WorldExpo’10 [3],Mall [4] 等)。数据标注均在对应train.json文件中,每张训练图片的标注为以下两种方式之一: 

(1)部分数据对图中行人提供了方框标注(boundingbox),格式为[x, y, w, h][x,y,w,h]; 

(2)部分图对图中行人提供了头部的打点标注,坐标格式为[x, y][x,y]。此外部分图片还提供了忽略区(ignore_region)标注,格式为[x_0, y_0, x_1, y_1, …, x_n, y_n]组成的多边形(注意一张图片可能有多个多边形忽略区),图片在忽略区内的部分不参与训练/测试。


人流密度检测网络训练使用的CNN模型部分代码:

#二 网络配置print('二 网络配置')
class CNN(fluid.dygraph.Layer): ''' 网络 ''' def __init__(self): super(CNN, self).__init__()
self.conv01_1 = fluid.dygraph.Conv2D(num_channels=3, num_filters=64,filter_size=3,padding=1,act="relu") self.pool01=fluid.dygraph.Pool2D(pool_size=2,pool_type='max',pool_stride=2)
self.conv02_1 = fluid.dygraph.Conv2D(num_channels=64, num_filters=128,filter_size=3, padding=1,act="relu") self.pool02=fluid.dygraph.Pool2D(pool_size=2,pool_type='max',pool_stride=2)
self.conv03_1 = fluid.dygraph.Conv2D(num_channels=128, num_filters=256,filter_size=3, padding=1,act="relu") self.pool03=fluid.dygraph.Pool2D(pool_size=2,pool_type='max',pool_stride=2)
self.conv04_1 = fluid.dygraph.Conv2D(num_channels=256, num_filters=512,filter_size=3, padding=1,act="relu") #self.pool04=fluid.dygraph.Pool2D(pool_size=2,pool_type='max',pool_stride=2)
self.conv05_1 = fluid.dygraph.Conv2D(num_channels=512, num_filters=512,filter_size=3,padding=1, act="relu") #self.pool05=fluid.dygraph.Pool2D(pool_size=2,pool_type='max',pool_stride=2)
self.conv06 = fluid.dygraph.Conv2D(num_channels=512,num_filters=256,filter_size=3,padding=1,act='relu') self.conv07 = fluid.dygraph.Conv2D(num_channels=256,num_filters=128,filter_size=3,padding=1,act='relu') self.conv08 = fluid.dygraph.Conv2D(num_channels=128,num_filters=64,filter_size=3,padding=1,act='relu') self.conv09 = fluid.dygraph.Conv2D(num_channels=64,num_filters=1,filter_size=1,padding=0,act=None)
def forward(self, inputs, label=None): """前向计算""" out = self.conv01_1(inputs) #print('after conv01_1 shape:',out.shape) #[3, 64, 640, 480] out = self.pool01(out) #print('after pool01 shape:',out.shape) #[3, 64, 320, 240]
out = self.conv02_1(out) #print('after conv02_1 shape:',out.shape) #[3, 128, 320, 240] out = self.pool02(out) #print('after pool02 shape:',out.shape) #[3, 128, 160, 120]
out = self.conv03_1(out) #print('after conv03_1 shape:',out.shape) #[3, 256, 160, 120] out = self.pool03(out) #print('after pool03 shape:',out.shape) #[3, 256, 80, 60]
out = self.conv04_1(out) #print('after conv04 shape:',out.shape) #[3, 512, 80, 60]
out = self.conv05_1(out) #print('after conv05 shape:',out.shape) #[3, 512, 80, 60] out = self.conv06(out) #print('after conv06 shape:',out.shape) #[3, 256, 80, 60]
out = self.conv07(out) #print('after conv07 shape:',out.shape) #[3, 128, 80, 60]
out = self.conv08(out) #print('after conv08 shape:',out.shape) #[3, 64, 80, 60]
#out = fluid.layers.dropout(out, dropout_prob=0.5)
out = self.conv09(out) #print('after conv09 shape:',out.shape) #[3, 1, 80, 60] return out


目前最好成绩排名:57/324 【仍然还在训练,希望可以训练出平均错误率更小的模型;GPU算力如此宝贵,一定要用光百度免费给的!】

深度学习7日入门-百度PaddlePaddle框架学习小结





Day6 PaddleSlim模型压缩



PaddleSlim为飞桨模型压缩工具集,本节主要内容为PaddleSlim和模型压缩、PaddleSlim实战和使用Paddle-Lite快速部署。

PaddleSlim将前期训练完成的模型,通过减少模型的参数量,提高精度,减少模型的计算量以及设计更高效的网络结构可以得到好用的小模型,这样可以在那些要求比较高的场景下使用,例如移动端或嵌入式设备上。


深度学习7日入门-百度PaddlePaddle框架学习小结


通过剪裁、量化、蒸馏及NAS(Network Architecture Search)等主流模型压缩方法,使模型小型化,适配更多使用场景。


Paddle-Lite可以实现模型的快速部署






总结


一定要看哦!!!



★深度学习入门有套路:这个套路就是按照数据处理--模型设计--训练配置--训练过程--保存/加载这样的步骤,在百度PaddlePaddle飞桨框架的加持下一切变得很简单

在以上套路下,完备的训练和测试数据集,网络模型搭建及参数调优,将是得到好模型的必要条件

★没有理论支撑,就算数据充分、神经网络搭建没问题,参数调优也无从下手;实践中,只能看到实际预测的准确率等数据,至于怎么提高,能提高到多少,参数应该怎么调还没有概念(理论基础的重要性)

算力多真好,GPU算力更好。同样的数据,只能使用CPU的本地小本本吭哧吭哧,还常常告警“硬件温度异常”。

★接下来,我将进一步学习,计划通过深度学习神经网络实现一个图片分类模型,用于图书馆阅览室场景下座位状态的检测,两种分类标签分别为座位有人和座位无人,类似于口罩分类但需要对图片进行多个座位网格处理。今晚我就用完全部算力了,期待百度的算力卡!





the end.

以上是关于深度学习7日入门-百度PaddlePaddle框架学习小结的主要内容,如果未能解决你的问题,请参考以下文章

教程 | 如何用百度深度学习框架PaddlePaddle做数据预处理

百度上线深度学习利器Visual DL 通吃各大深度学习框架

百度首发深度学习新工具Visual DL 支持各大深度学习框架

推荐百度深度学习平台PaddlePaddle的深度学习入门教程

大新闻|PaddlePaddle联手Kubernetes 助力深度学习模型高效发展

百度深度学习平台PaddlePaddle框架解析