首页 AI Studio教育版 帖子详情
百度飞桨七天打卡小结
收藏
快速回复
AI Studio教育版 文章课程答疑 1259 5
百度飞桨七天打卡小结
收藏
快速回复
AI Studio教育版 文章课程答疑 1259 5

百度飞桨深度学习打卡营心得
一、前言
在当前国外深度学习框架风靡全球时,国内也提出了很多深度学习框架,以最先由百度提出的paddlepaddle为代表,逐渐在国内各个研究机构和高校使用。

paddlepaddle框架融合了静态图和动态图,更能满足普通大众的使用,并集成了多个网络结构与损失函数,可以方便地调用。同时,为了解决普通大众对于paddlepaddle的不熟悉问题,开放了很多的课程以及多个说明文档帮助学生学习,亦提供丰富的免费算力,给予没有GPU计算能力的学生一个更好的科研机会。
以下链接是paddle使用说明文档,对于函数的调用、功能的编写都有相应的说明,可以帮助学生更好的融入paddle框架中:https://www.paddlepaddle.org.cn/documentation/docs/zh/api_cn/index_cn.html。

 

本人之前接触过tensorflow学习框架,偶然机会开始学习paddlepaddle,之前曾在paddlepaddle上完成了几项目标检测的任务,但也充分暴露出自己能力的不足,对于框架的不熟悉,因此搜索paddle提供的课程,并参加了深度学习7日入门-CV疫情特辑篇。以下是个人的一些总结与心得。


二、七日深度学习
Day1. 图像处理与深度学习入门
Day1中介绍了图像识别问题和定义、传统处理方法和人工智能的发展。从机器学习到深度学习,提取图像的特征越来越强,相对于传统方法,深度学习不再使用人工提取特征,反而让网络自己学习特征,如此一来,更能称之为人工智能,但是当前阶段仍处于弱人工智能阶段,距离强人工智能仍有很长的路要走。

第一天的任务是爬取数据与可视化疫情地图,对于我来说算是一个额外收获,一直想要试试数据爬取方面,倒是有了个机会。从丁香园官网上爬取当日数据并绘制疫情地图、饼状图、增长率等。

Day2. 手势识别
Day2的内容主要是介绍机器学习与入门的一些知识,并使用全连接层搭建网络,实现手势的识别。此处的手势识别指的是数字0-9的识别。

老师介绍通过全连接层加上dropout多次训练之后可达到95%的精度,由于自身没有参数调整的那个能力,于是采用卷积神经网络来搭建,代码如下:

class MyDNN(fluid.dygraph.Layer):
    def __init__(self):
        super(MyDNN, self).__init__()
        self.conv1 = Conv2D(3, 50, 5, act='relu')
        #输入是3*100*100, 输出是50*96*96
        self.pool1 = Pool2D(pool_size=2, pool_stride=2)
        #池化之后输出是50*48*48
        self.conv2 = Conv2D(50, 100, 5, act='relu')
        #输出是100*44*44
        self.pool2 = Pool2D(pool_size=2, pool_stride=2)
        #s输出是100*22*22
        self.conv3 = Conv2D(100, 200, 5, act='relu')
        #输出是200*18*18
        self.pool3 = Pool2D(pool_size=2, pool_stride=2)
        #输出是200*9*9
        self.conv4 = Conv2D(200, 400, 5, act='relu')
        #输出是400*5*5
        self.conv5 = Conv2D(400, 400, 5, act='relu')
        #输出是400*1*1
        self.fc1 = Linear(400, 200, act='relu')
        self.fc2 = Linear(200, 10, act='softmax')
    
    def forward(self, input):
        x= self.conv1(input)
        x= self.pool1(x)
        x= self.conv2(x)
        x= self.pool2(x)
        x= self.conv3(x)
        x= self.pool3(x)
        x= self.conv4(x)
        x= self.conv5(x)
        x = fluid.layers.reshape(x, shape=[-1, 400])

        x= self.fc1(x)
        y = self.fc2(x)
        return y


最终的精度达到了0.99553573,预测图片下过如下:

Day3. 车牌识别
Day3的主要内容是介绍卷积神经网络,先介绍了全连接层神经网络的不足:网络结构不够灵活,输入尺度改变相应的全连接层结构也要变化;并且模型参数量巨大,难以训练以及占用太多的存储空间。在此基础上改进即有了卷积神经网络,
其具有三大特性:局部连接、权值共享和下采样,可以减少网络参数,加速网络训练。

而此次的任务即是完成车牌检测,搭建的网络如下:

#定义网络
class MyLeNet(fluid.dygraph.Layer):
    def __init__(self):
        super(MyLeNet,self).__init__()
        self.hidden1_1 = Conv2D(1, 50, 5, padding=1, act='relu')
        #输出为20*18*18
        self.hidden1_2 = Pool2D(pool_size=2, pool_stride=2)
        #输出为20*9*9
        self.hidden2_1 = Conv2D(50, 100, 3, stride=2, act='relu')
        #输出是50*4*4
        self.hidden2_2 = Pool2D(pool_size=2, pool_stride=2)
        #输出是50*2*2
        self.hidden3 = Conv2D(100, 200, 2, act='relu')
        self.hidden4 = Linear(200, 200, act='relu')
        self.hidden5 = Linear(200, 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.reshape(x, shape=[-1, 200])
        x = self.hidden4(x)
        y = self.hidden5(x)

        return y


最终的验证集精度达到了0.99027985,验证图像如下所示:


Day4. 口罩识别
Day4的内容介绍了计算机视觉主要任务和一些经典的神经网络。计算机主要视觉任务可分为三类:图像分类、目标检测以及图像分割,而图像分割包含语义分割和实例分割两种。

经典的CNN网络有LeNet、AlexNet、VGG、GoogLeNet、ResNet等,此次任务即采用VGG16网络实现口罩识别。

VGG网络结构如下所示:

class ConvPool(fluid.dygraph.Layer):
    '''卷积+池化'''
    def __init__(self,
                 num_channels,
                 num_filters,
                 filter_size,
                 pool_size,
                 pool_stride,
                 groups,
                 pool_padding=0,
                 pool_type='max',
                 conv_stride=1,
                 conv_padding=0,
                 act=None):
        super(ConvPool, self).__init__()  

        self._conv2d_list = []

        for i in range(groups):
            conv2d = self.add_sublayer(   #返回一个由所有子层组成的列表。
                'bb_%d' % i,
                fluid.dygraph.Conv2D(
                num_channels=num_channels, #通道数
                num_filters=num_filters,   #卷积核个数
                filter_size=filter_size,   #卷积核大小
                stride=conv_stride,        #步长
                padding=conv_padding,      #padding大小,默认为0
                act=act)
            )
        self._conv2d_list.append(conv2d)   

        self._pool2d = fluid.dygraph.Pool2D(
            pool_size=pool_size,           #池化核大小
            pool_type=pool_type,           #池化类型,默认是最大池化
            pool_stride=pool_stride,       #池化步长
            pool_padding=pool_padding      #填充大小
            )

    def forward(self, inputs):
        x = inputs
        for conv in self._conv2d_list:
            x = conv(x)
        x = self._pool2d(x)
        return x


在训练之后验证集取得了100%的成绩,验证图像如下所示:


Day5. PaddleHub概述与人流密度检测竞赛发布


Day5的内容先介绍了迁移学习PaddleHub的使用,再发布了基础比赛人流密度检测试题。
Paddlehub是飞桨预训练模型管理和迁移学习工具,拥有丰富的预训练模型,覆盖文本、图像、视频三大领域,使用一行代码即可完成模型预测,十行代码完成迁移学习。
开源的链接:https://github.com/PaddlePaddle/PaddleHub

作用于人流密集场景的人流密度估计技术(crowd density estimation)因其远高于肉眼计数的准确率和速度,已广泛应用于机场、车站、运营车辆、艺术展馆等多种场景,一方面可有效防止拥挤踩踏、超载等隐患发生,另一方面还可帮助零售商等统计客流。本试题以人流密度估计作为内容,答题者需要以对应主题作为技术核心,开发出能适用于密集、稀疏、高空、车载等多种复杂场景的通用人流密度估计算法,准确估计出输入图像中的总人数。
该比赛的数据集来自于一般监控场景中,包括多视角(低空、高空、鱼眼等)。图中行人的尺寸也有较大差异,提供的标注信息有bounding box也有头部打点标注,另外部分图片提供了忽略区。
最终的结果上交需包含id和predicted结果的csv文件。
当前最好的成绩排名为36/273,有待于进一步提高。


Day6. PaddleSlim模型压缩


PaddleSlim是什么,有什么?
其包含剪裁、量化、蒸馏和nas。通过剪裁对卷积神经网络通道数进行剪裁,将大模型的参数量变少;通过量化,将float32计算变成int计算,使计算量及模型体积减少;通过蒸馏,将大模型的知识迁移到小模型上,使得小模型精度提高;通过nas,以模型大小和推理速度为约束条件搜索模型结构,设计出更高效的网络结构。


三、 心得体会

通过为期一周的学习,收获颇多。
好久没有这么认真的干过什么事了,每天花费很大的时间和精力来完成今日的任务,由于在线人数众多,很难有机会获得高级版本运行,熬夜干过凌晨四点,那时候人少,最有可能使用GPU版本的。
感谢paddlepaddle提供的算力卡,一周累积下来也有70多小时了,能够方便我学习用途。
感谢班班还有众多老师们的付出与指导,期待着下次再来参加论文复现营。
最后的最后,愿自己保重身体,这几天肝得够呛……

0
收藏
回复
全部评论(5)
时间顺序
学习委员
#2 回复于2020-04

赞一个~~~写的很详细

1
回复
MLTcola
#3 回复于2020-04

请问你觉得tensorflow好用还是飞桨好用??

 

0
回复
AIStudio810258
#4 回复于2020-04

学得很认真啊。继续加油,共同进步。

1
回复
叮叮咚咚呛
#5 回复于2020-04
MLTcola #3
请问你觉得tensorflow好用还是飞桨好用??  

怎么说呢,tensorflow是静态图,而paddle即有静态也有动态,这方面切换倒是很舒服,能像动态图pytorch那样使用,非常方便的,现在paddle也提供算力,很方便搞研究

0
回复
叮叮咚咚呛
#6 回复于2020-04
MLTcola #3
请问你觉得tensorflow好用还是飞桨好用??  

另外,tensorflow出了2.0新的版本,了解的不多,听说变化很大,如果想学tensorflow的话,建议不要使用新的版本,1.14及以前的比较好点,论文中给的代码,大部分都是比较老的,用新版本跑,很容易出问题

0
回复
在@后输入用户全名并按空格结束,可艾特全站任一用户