PaddlePaddle深度学习七天打卡营学习心得

1 篇文章 0 订阅
1 篇文章 0 订阅

疫情期间百度PaddlePaddle团队推出深度学习7日入门-CV疫情特辑课程,我着实体验了一下。7天的打卡课程都是理论与实践相结合,而且采用的都是非常流行的项目,一下子就激发了我对PaddlePaddle这个深度学习框架的兴趣。

5个新冠疫情最新实战案例和1场人流密度实战比赛,所有项目实践都是基于百度aistudio平台,最开心的还是能用上免费的Tesla V100。简单说一下整个学习的心得体会吧。

第一天打卡是一个新冠疫情可视化的项目,主要是爬取丁香园的统计数据并使用Pyecharts绘制疫情分布图。这个python的小项目让我学习到了pyecharts这个强大的可视化工具,可以将各种图表优雅地呈现出来。Pycharts api可参考:https://pyecharts.org/#/zh-cn/

接下来三天都是图像识别相关的项目,分别是手势识别,车牌识别和口罩识别。这几个项目都是练习PaddlePaddle搭建cnn网络以及进行模型训练预测,可以说PaddlePaddle搭建训练pipeline还是比较方便的。基于动态图实现的VGG代码如下,感觉比较类似Pytorch。

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

基于fluid.dygraph.Layer这个类先定义基本的模块,然后定义网络部分,其中forward函数中的代码就代表了前向传播过程。
通过这种方式可以很快地搭建各种网络。

class VGGNet(fluid.dygraph.Layer):
    '''
    VGG网络
    '''
    def __init__(self):
        super(VGGNet, self).__init__()
        self.convpool01 = ConvPool(3, 64, 3, 2, 2, 2, conv_padding=1, act="relu")
        self.convpool02 = ConvPool(64, 128, 3, 2, 2, 2, conv_padding=1, act="relu")
        self.convpool03 = ConvPool(128, 256, 3, 2, 2, 3, conv_padding=1, act="relu")
        self.convpool04 = ConvPool(256, 512, 3, 2, 2, 3, conv_padding=1, act="relu")
        self.convpool05 = ConvPool(512, 512, 3, 2, 2, 3, conv_padding=1, act="relu")

        self.pool_5_shape = 512 * 7 * 7
        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):
        """前向计算"""
        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, self.pool_5_shape])
        out = self.fc01(out)
        out = self.fc02(out)
        out = self.fc03(out)

        if label is not None:
            acc = fluid.layers.accuracy(out, label)
            return out, acc
        return out

图像分类任务是CV的基础,在时间过程中通过改进代码调参让测试准确率从baseline一点点提升到较高的水平是最有价值的过程。PaddlePaddle有丰富的api可以实现各种调参trick,像dropout,batchnormalization,groupnormalization,l2regularization, lr decay等等都可以很轻松地实现。另外数据增强则推荐使用PIL库,尝试各种技巧不一定每次都能让模型准确度提升,毕竟训练神经网络是一个多参数配合的过程,只有练得多了才更容易找到最佳的方向。

除了图像分类任务外,还有一个人流密度检测的比赛项目。这个稍微难一些,baseline方案是用cnn生成一个热点图进行统计来预测出人的数量。这个任务需要对groundtruth进行处理,得到用于计算损失函数的热力图,我做这个任务时立刻联想到了centernet,于是尝试用了类似的反卷积思想。不过比赛发布后大家积极性很高,我几乎也抢不到GPU,只能草草地提交了几次结果,后面有空再继续调一下模型。

最后还有一个PaddleSlim模型压缩,真心觉得PaddlePaddle在工业部署上优势明显。PaddleSlim包含了模型裁减/量化/蒸馏/nas这些主流的模型压缩方法,经过模型压缩推理速度显著提高,甚至精度还可能不减反升,意外吧。

PaddleSlim相关api文档可以看https://paddlepaddle.github.io/PaddleSlim/api_cn/index.html

除了PaddleSlim,像PaddleDetection,PaddleSeg也是PaddlePaddle的精品大作,对CV感兴趣的小伙伴们也不要错过。也期待PaddlePaddle继续带来更多的惊喜。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值