从去年年底参加百度飞桨集训营以来,目前学习进度已经完成了一小部分,感觉有很大的成长,弥补了自己很多不足,特写篇心得记录一下。
先介绍一下背景,我原来做的是机器学习相关,数据降维中流形学习的相关研究,毕业后现在从事的是自然语言处理的工作。当时面试的时候也面试了比较多的计算机视觉的岗位,当时虽然在书本上以及视频网课学习了一些基本概念,但是一方面没有深入了解算法,代码框架等原理,另一方面也没有具体实践项目的经验,在面试的时候碰了很多壁。比如当时面试时候遇到一个很简单的问题,让介绍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,,大家一起成长