飞桨PaddlePaddle-百度架构师手把手带你零基础实践深度学习-学习心得

课程本身就很吸引人,而且讲述的非常清晰、深入。因为我目前正在研究深度学习方面的内容,所以对这些理论知识掌握得比较好,学习来没有什么压力,但是我在实践上还没有过深度学习的经历,这也是我学习这门课程的原因。目前我们进行到了目标检测章节,记录一下心得。

大纲

课程前言
第一章:零基础入门深度学习
第二章:一个案例吃透深度学习
第三章:深度学习实践应用——计算机视觉
第四章:目标检测YoloV3
第五章:深度学习实践应用——自然语言处理
第六章:情感分类
第七章:深度学习实践应用——推荐系统
第八章:深度学习高阶导入
拓展:【AI实战案例项目集】

学习内容

一个案例吃透深度学习

在“手写数字识别”任务中,课程使用创新性的“横纵式”教学法进行深度学习建模介绍 ,非常适用于初学者。

paddle的代码也是非常简单易懂,更简洁,下面选取了训练过程的代码

# 通过with语句创建一个dygraph运行的context
# 动态图下的一些操作需要在guard下进行
with fluid.dygraph.guard():
    model = MNIST()
    model.train()
    train_loader = paddle.batch(paddle.dataset.mnist.train(), batch_size=16)
    optimizer = fluid.optimizer.SGDOptimizer(learning_rate=0.001, parameter_list=model.parameters())
    EPOCH_NUM = 10
    for epoch_id in range(EPOCH_NUM):
        for batch_id, data in enumerate(train_loader()):
            #准备数据,格式需要转换成符合框架要求
            image_data = np.array([x[0] for x in data]).astype('float32')
            label_data = np.array([x[1] for x in data]).astype('float32').reshape(-1, 1)
            # 将数据转为飞桨动态图格式
            image = fluid.dygraph.to_variable(image_data)
            label = fluid.dygraph.to_variable(label_data)
            
            #前向计算的过程
            predict = model(image)
            
            #计算损失,取一个批次样本损失的平均值
            loss = fluid.layers.square_error_cost(predict, label)
            avg_loss = fluid.layers.mean(loss)
            
            #每训练了1000批次的数据,打印下当前Loss的情况
            if batch_id !=0 and batch_id  % 1000 == 0:
                print("epoch: {}, batch: {}, loss is: {}".format(epoch_id, batch_id, avg_loss.numpy()))
            
            #后向传播,更新参数的过程
            avg_loss.backward()
            optimizer.minimize(avg_loss)
            model.clear_gradients()

    # 保存模型
    fluid.save_dygraph(model.state_dict(), 'mnist')

在这个案例中,数据处理是我愿意收藏下来的:


imgs, labels = train_set[0], train_set[1]
print("训练数据集数量: ", len(imgs))
# 获得数据集长度
imgs_length = len(imgs)
# 定义数据集每个数据的序号,根据序号读取数据
index_list = list(range(imgs_length))
# 读入数据时用到的批次大小
BATCHSIZE = 100

# 随机打乱训练数据的索引序号
random.shuffle(index_list)

# 定义数据生成器,返回批次数据
def data_generator():

    imgs_list = []
    labels_list = []
    for i in index_list:
        # 将数据处理成期望的格式,比如类型为float32,shape为[1, 28, 28]
        img = np.reshape(imgs[i], [1, IMG_ROWS, IMG_COLS]).astype('float32')
        label = np.reshape(labels[i], [1]).astype('float32')
        imgs_list.append(img) 
        labels_list.append(label)
        if len(imgs_list) == BATCHSIZE:
            # 获得一个batchsize的数据,并返回
            yield np.array(imgs_list), np.array(labels_list)
            # 清空数据读取列表
            imgs_list = []
            labels_list = []

    # 如果剩余数据的数目小于BATCHSIZE,
    # 则剩余数据一起构成一个大小为len(imgs_list)的mini-batch
    if len(imgs_list) > 0:
        yield np.array(imgs_list), np.array(labels_list)
    return data_generator

接下来,课程又通过拆分数据集、将单层网络变成多层网络、改变损失函数、设置合适的学习率等多种方法提高识别的精度。

计算机视觉

在第二周的学习中,老师对计算机视觉、卷积神经网络进行了讲解,之后给大家讲述了几种经典的图像分类模型,分别是LeNet, AlexNet, VGG, GoogLeNet和ResNet,并将它们应用到眼疾筛查数据集上。除了LeNet不适合大尺寸的图像分类问题之外,其它几个模型在此数据集上损失函数都能显著下降,在验证集上的预测精度在90%左右。

# 定义 LeNet 网络结构
class LeNet(fluid.dygraph.Layer):
    def __init__(self, num_classes=1):
        super(LeNet, self).__init__()

        # 创建卷积和池化层块,每个卷积层使用Sigmoid激活函数,后面跟着一个2x2的池化
        self.conv1 = Conv2D(num_channels=1, num_filters=6, filter_size=5, act='sigmoid')
        self.pool1 = Pool2D(pool_size=2, pool_stride=2, pool_type='max')
        self.conv2 = Conv2D(num_channels=6, num_filters=16, filter_size=5, act='sigmoid')
        self.pool2 = Pool2D(pool_size=2, pool_stride=2, pool_type='max')
        # 创建第3个卷积层
        self.conv3 = Conv2D(num_channels=16, num_filters=120, filter_size=4, act='sigmoid')
        # 创建全连接层,第一个全连接层的输出神经元个数为64, 第二个全连接层输出神经元个数为分类标签的类别数
        self.fc1 = Linear(input_dim=120, output_dim=64, act='sigmoid')
        self.fc2 = Linear(input_dim=64, output_dim=num_classes)
    # 网络的前向计算过程
    def forward(self, x):
        x = self.conv1(x)
        x = self.pool1(x)
        x = self.conv2(x)
        x = self.pool2(x)
        x = self.conv3(x)
        x = fluid.layers.reshape(x, [x.shape[0], -1])
        x = self.fc1(x)
        x = self.fc2(x)
        return x

paddle对网络结构的实现也是简洁明了。

接下来我们学习了目标检测,使用YoLoV3来对AI识虫数据集来训练模型。在新人练习赛中,大家再次在AI识虫数据集上,对模型进行改进,并且比赛的结果排行榜有许多大佬取得了90分以上的成绩,70分以上的人数占了绝大一部分,可见这个课程的效果还是非常好的。

感受

在这21天的学习中,我收获了不仅是深度学习的知识,更提升了自己的代码水平,也掌握了paddle的用法,能够用paddle自己完成一些简单的模型,加入课程之后,每天有按时打卡的作业,能够帮助大家巩固所学的内容,每周也有实践作业,让大家更熟练地去运用paddle来完成自己的工作。

我非常喜欢这门课程,在21天带学活动结束后,我也会持续关注后续的自然语言处理和推荐系统课程,并且让paddle作为我以后深度学习编程的首选。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章