飞桨深度学习集训营学习心得

从去年年底参加百度飞桨集训营以来,目前学习进度已经完成了一小部分,感觉有很大的成长,弥补了自己很多不足,特写篇心得记录一下。

先介绍一下背景,我原来做的是机器学习相关,数据降维中流形学习的相关研究,毕业后现在从事的是自然语言处理的工作。当时面试的时候也面试了比较多的计算机视觉的岗位,当时虽然在书本上以及视频网课学习了一些基本概念,但是一方面没有深入了解算法,代码框架等原理,另一方面也没有具体实践项目的经验,在面试的时候碰了很多壁。比如当时面试时候遇到一个很简单的问题,让介绍vgg,我当时居然都没接触过vgg,只知道卷积网络,居然都不知道vgg,确实很差。

去年开始有机会进入飞桨集训营的课程,当前主要学习的都是计算机视觉相关的,当然马上要开自然语言处理,这部分也是我工作中直接会用到的,所以很期待,后期还会有搜索等ai相关的课程,欢迎大家一起学习。

在计算机视觉相关的课程中,首先学习到了使用飞桨框架搭建简单的网络,一个简单的线性回归网络,毕然老师讲解的很生动有趣,飞桨框架是一个类似tensorflow的框架,整体很简单易学,网上学习还可以有免费的显卡使用优势。

接下来主要就是学习的卷积网络,包括卷积原理,具体网络的实现,这课中主要学习了dropout的原理,一直没太理解,主要经典框架lenet的学习,后面还有alexnet vgg,googlenet resnet,后面两个还没太搞懂完全,会继续多看几遍视频

比如resnet的代码实现就很简单理解

# 定义ResNet模型
class ResNet(fluid.dygraph.Layer):
    def __init__(self, name_scope, layers=50, class_dim=1):
        """
        name_scope,模块名称
        layers, 网络层数,可以是50, 101或者152
        class_dim,分类标签的类别数
        """
        super(ResNet, self).__init__(name_scope)
        self.layers = layers
        supported_layers = [50, 101, 152]
        assert layers in supported_layers, \
            "supported layers are {} but input layer is {}".format(supported_layers, layers)

        if layers == 50:
            #ResNet50包含多个模块,其中第2到第5个模块分别包含3、4、6、3个残差块
            depth = [3, 4, 6, 3]
        elif layers == 101:
            #ResNet101包含多个模块,其中第2到第5个模块分别包含3、4、23、3个残差块
            depth = [3, 4, 23, 3]
        elif layers == 152:
            #ResNet50包含多个模块,其中第2到第5个模块分别包含3、8、36、3个残差块
            depth = [3, 8, 36, 3]
        
        # 残差块中使用到的卷积的输出通道数
        num_filters = [64, 128, 256, 512]

        # ResNet的第一个模块,包含1个7x7卷积,后面跟着1个最大池化层
        self.conv = ConvBNLayer(
            self.full_name(),
            num_channels=3,
            num_filters=64,
            filter_size=7,
            stride=2,
            act='relu')
        self.pool2d_max = Pool2D(
            self.full_name(),
            pool_size=3,
            pool_stride=2,
            pool_padding=1,
            pool_type='max')

        # ResNet的第二到第五个模块c2、c3、c4、c5
        self.bottleneck_block_list = []
        num_channels = 64
        for block in range(len(depth)):
            shortcut = False
            for i in range(depth[block]):
                bottleneck_block = self.add_sublayer(
                    'bb_%d_%d' % (block, i),
                    BottleneckBlock(
                        self.full_name(),
                        num_channels=num_channels,
                        num_filters=num_filters[block],
                        stride=2 if i == 0 and block != 0 else 1, # c3、c4、c5将会在第一个残差块使用stride=2;其余所有残差块stride=1
                        shortcut=shortcut))
                num_channels = bottleneck_block._num_channels_out
                self.bottleneck_block_list.append(bottleneck_block)
                shortcut = True

        # 在c5的输出特征图上使用全局池化
        self.pool2d_avg = Pool2D(
            self.full_name(), pool_size=7, pool_type='avg', global_pooling=True)

        # stdv用来作为全连接层随机初始化参数的方差
        import math
        stdv = 1.0 / math.sqrt(2048 * 1.0)
        # 创建全连接层,输出大小为类别数目
        self.out = FC(self.full_name(),
                      size=class_dim,
                      param_attr=fluid.param_attr.ParamAttr(
                          initializer=fluid.initializer.Uniform(-stdv, stdv)))

        
    def forward(self, inputs):
        y = self.conv(inputs)
        y = self.pool2d_max(y)
        for bottleneck_block in self.bottleneck_block_list:
            y = bottleneck_block(y)
        y = self.pool2d_avg(y)
        y = self.out(y)
        return y

还有一部分是目标检索,图像分类的学习,主要是yolov3框架的学习,关于锚点,计算iou等都很详细

接下来介绍的自然语言理解,在我实际工作中关于文本分类,问答系统会有很大的帮助,接下来会继续跟着直播视频学习,在工作中也会试着使用paddlepaddle,,大家一起成长

 

你可能感兴趣的:(NLP)