【paddle深度学习高层API七日打卡营】三岁水课第一天—认识AI与手写数字识别的一天

简介: 大家好,这里是三岁,别的不会,擅长白话,今天就是我们的白话系列,内容是paddle2.0新出的高程API,在这里的七日打卡营0基础学习,emmm我这个负基础的也来凑凑热闹,那么就开始吧~~~~注:以下白话内容为个人理解,如有不同看法和观点及不对的地方欢迎大家批评指正!

大家好,这里是三岁,别的不会,擅长白话,今天就是我们的白话系列,内容是paddle2.0新出的高程API,在这里的七日打卡营0基础学习,emmm我这个负基础的也来凑凑热闹,那么就开始吧~~~~

注:以下白话内容为个人理解,如有不同看法和观点及不对的地方欢迎大家批评指正!


传说中的第四次“工业革命”



20210204123024713.png


【白话时间】人工智能缩写AI,大家已经见过很多的人工智能产品,而且越来越多的产品在不断的涌现,质量效果也越来越好

前几年有一个对人工智能的爱称“人工智障”训练的好是人工智能训练不好是“人工智障”,但是近年来,水平的不断提高,在非常多方面已经超过了之前的水平,甚至有非常有意义的使用价值(部分方面超过人

那么人工智能下面有哪些分支和我们要学的深度学习又有说没关系嗯?


20210204125001704.png


人工智能>机器学习>深度学习

人工智能大家都知道那么什么是机器学习???

回顾人类的历史长河,我们是怎么样一步一步的创新,发展的?

在生物中这个叫做变异,当然有正确的有错误的,所以就有了现在大家说知晓的适者生存,不适者淘汰的理论

那么机器可不可以通过不断的尝试试错得到一个比较好的理论呢???


20210204131852959.png



看到这个图就知道了,其实 是一样的,规律就是大家不断探索以后得到的一个结果,也就是一个试错的过程。通过我们构建的一个规则然后机器通过算力不断的探索,最后得到一个比较好的结果,这个结果就是传说中的“规律”。


机器学习就是通过一个“函数”(模型)来判断输出你想要的比较合适的一个结果


深度学习就是通过一些神经网络等方法,提取我们的一些特征进行处理。

计算机识别的都是二进制内容不好理解


我们举一个栗子大家就明白了,如果说水果是臭的带刺的你们会想到什么水果,那基本上就是榴莲,通过几个特殊的特征进行提取。


20210204133047668.png


神经网络


20210204133413807.png


神经元:和我们的神经元类似,但是他更类似于数学函数里面的斜率之类的一些重要参数。(有加权和、激活函数等构成)


多层神经网络:相对应人类的神经传导,输入相对应接受电信号并传输到大脑皮层的一个过程,前向计算:相对应大脑给出一个指令然后进行运行;返回传播:相对应输入信息不断更新后大脑发出指令完成系列任务,输出相对应完成一件事情。


栗子:手碰到针,大脑皮层会产生痛觉然后大脑(应该是脑干)会发出收手的信号然后会一直检测直到痛感消失。


20210204141446620.png

2021020414153195.png

20210204141542450.png


在不断的发展过程,越来越多的内容标准化,逐步的形成了一些框架和架构。


深度学习万能开发公示


20210204144558903.png


深度学习训练就像是我们平时的考试,数据是知识,模型是我们的大脑,调优就是我们学习的方法,最后的预测相对应我们的考试,评价我们对知识的掌握情况


20210204145236941.png


里面的loss是用于评判模型训练过程好坏的一个值,相对应我们平时对学习方法的一种认可与否。

score这是判断学习成果的,相对应单元测试卷(以上是个人认知,不对可以批评指正,相互学习)

2021020414550229.png


闻说双飞桨,翩然下广津



20210204150451722.png2021020415053168.png


paddle的高层API

里面涵盖了大量的基础API和实现方法,使用方便快捷

API文档传送门


20210204151415884.png


手写数字识别实战


20210204152107342.png这个内容三岁之前也做过,看了一下发现没有那么的详细但是还是恬不知耻把项目链接什么的贴出来,有兴趣的小伙伴可以去看看

『深度学习7日打卡营』第1课案例:手写数字识别(课程代码地址)

PaddlePaddle2.0 ——手写数字识别(三岁白话paddle项目)

[三岁白话系列]PaddlePaddle2.0——手写数字识别(三岁白话paddle系列博客)


20210204152653594.png


官网传送门


20210204152852858.png2021020415292856.png

20210204152939427.png


20210204153008461.png


上面的4步就是我们完成一个书写数字识别的流程,接下来就是雨哥详细代码解析,有一说一,真的细节!

『深度学习7日打卡营』第1课案例:手写数字识别(课程代码地址)


代码解析


数据处理


20210204153819522.png


import paddle.vision.transforms as T
# 数据的加载和预处理
transform = T.Normalize(mean=[127.5], std=[127.5])
# 训练数据集
train_dataset = paddle.vision.datasets.MNIST(mode='train', transform=transform)
# 评估数据集
eval_dataset = paddle.vision.datasets.MNIST(mode='test', transform=transform)
print('训练集样本量: {},验证集样本量: {}'.format(len(train_dataset), len(eval_dataset)))


这个里面涉及了两个高层的API

让我们一起看一下


20210204154247864.png

这个是paddle.vision.Normalize(mean=0.0, std=1.0, data_format='CHW', to_rgb=False, keys=None)

作用是图像归一化处理


20210204152852858.png


这个是paddle.vision.MNIST作用就是对书写数字识别进行下载并做基本处理。

就相当于把养殖场的活物给你处理好,直接可以下锅。

经过归一化处理和数据集的整理得到了以下结果:


训练集样本量: 60000,验证集样本量: 10000


数据查看


20210204155225393.png


print('图片:')
print(type(train_dataset[0][0]))  # 图片的类型
print(train_dataset[0][0])  # 输出图片(数组形式)
print('标签:')
print(type(train_dataset[0][1]))  # 标签的类型
print(train_dataset[0][1])  # 标签的值
# 可视化展示
plt.figure()
plt.imshow(train_dataset[0][0].reshape([28,28]), cmap=plt.cm.binary)
plt.show()


仔细观察就会发现这里面都非常容易理解,但是这个train_dataset[0][0]我们怎么自己得到?


print(train_dataset)
# 结果是生成器
# <paddle.vision.datasets.mnist.MNIST object at 0x7f95f4666ad0>
print(train_dataset[0])
# 得到的是数组


train_dataset就是由60000个数组组成的生成器


网络模型构造


c053095f46db1bdf5935b5b3b726d6a1.png


接下去就到神经网络了

输入层是784那么这个值是怎么来的???


20210204162228525.png


原始数据是28*28的大小,拉平成一维以后就是784


# 模型网络结构搭建
network = paddle.nn.Sequential(
    paddle.nn.Flatten(),           # 拉平,将 (28, 28) => (784)
    paddle.nn.Linear(784, 512),    # 隐层:线性变换层
    paddle.nn.ReLU(),              # 激活函数
    paddle.nn.Linear(512, 10)      # 输出层
)


paddle.nn.Sequential(*layers):顺序容器。子Layer将按构造函数参数的顺序添加到此容器中。传递给构造函数的参数可以Layers或可迭代的name Layer元组。

paddle.nn.Flatten(start_axis=1, stop_axis=- 1):它实现将一个连续维度的Tensor展平成一维Tensor

paddle.nn.Linear(in_features, out_features, weight_attr=None, bias_attr=None, name=None):线性变换层(建议自己去API文档理解)

paddle.nn.ReLU(name=None):ReLU激活层

paddle.nn.Linear(in_features, out_features, weight_attr=None, bias_attr=None, name=None):线性变换层-输出 (建议自己去API文档理解)


在这里面:输入是784已经固定,以为输入的一维数组是784,输出层的10已经固定,0-9为10个数值,需要进行判定

中间的只要输入的线性变换层的第二个值和输出的线性变换层第一个值一样就行


模型网络结构可视化


# 模型封装
model = paddle.Model(network)
# 模型可视化
model.summary((1, 28, 28))


通过对模型的封装然后展示可以获得每一次网络的啥情况进行一个查看和检测


---------------------------------------------------------------------------
 Layer (type)       Input Shape          Output Shape         Param #    
===========================================================================
   Flatten-1       [[1, 28, 28]]           [1, 784]              0       
   Linear-1          [[1, 784]]            [1, 512]           401,920    
    ReLU-1           [[1, 512]]            [1, 512]              0       
   Linear-2          [[1, 512]]            [1, 10]             5,130     
===========================================================================
Total params: 407,050
Trainable params: 407,050
Non-trainable params: 0
---------------------------------------------------------------------------
Input size (MB): 0.00
Forward/backward pass size (MB): 0.01
Params size (MB): 1.55
Estimated Total Size (MB): 1.57
---------------------------------------------------------------------------
{'total_params': 407050, 'trainable_params': 407050}


20210204164356631.png


这样子可以查看每一层的情况,包括学习的程度什么的


模型配置及训练


# 配置优化器、损失函数、评估指标
model.prepare(
paddle.optimizer.Adam(learning_rate=0.001, 
parameters=network.parameters()),
              paddle.nn.CrossEntropyLoss(),
              paddle.metric.Accuracy())
# 启动模型全流程训练
model.fit(train_dataset,  # 训练数据集
          eval_dataset,   # 评估数据集
          epochs=5,       # 训练的总轮次
          batch_size=64,  # 训练使用的批大小
          verbose=1)      # 日志展示形式


paddle.Modle.prepare(optimizer=None, loss_function=None, metrics=None):用于配置模型所需的部件,比如优化器、损失函数和评价指标。

paddle.optimizer.Adam:Adam优化器,能够利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。

paddle.nn.CrossEntropyLoss:该OP计算输入input和标签label间的交叉熵损失 ,它结合了 LogSoftmax 和 NLLLoss 的OP计算,可用于训练一个 n 类分类器。分类器

paddle.metric.Accuracy:计算准确率(accuracy)

paddle.Modle.fit:训练模型


模型评估


# 模型评估,根据prepare接口配置的loss和metric进行返回
result = model.evaluate(eval_dataset, verbose=1)
print(result)


paddle.Model.evaluate:在输入数据上,评估模型的损失函数值和评估指标。


模型预测


  • 批量预测
    使用model.predict接口来完成对大量数据集的批量预测。
# 进行预测操作
result = model.predict(eval_dataset)
# 定义画图方法
def show_img(img, predict):
    plt.figure()
    plt.title('predict: {}'.format(predict))
    plt.imshow(img.reshape([28, 28]), cmap=plt.cm.binary)
    plt.show()
# 抽样展示
indexs = [2, 15, 38, 211]
for idx in indexs:
    show_img(eval_dataset[idx][0], np.argmax(result[0][idx]))


paddle.Modle.predict:在输入数据上,预测模型的输出。

通过函数把模型预测结束后,抽取个别数据集进行处理并预测


  • 单张预测
# 读取单张图片
image = eval_dataset[501][0]
# 单张图片预测
result = model.predict_batch([image])
# 可视化结果
show_img(image, np.argmax(result))


paddle.Model.predict_batch:在一个批次的数据上进行测试


保存模型


# 保存用于后续继续调优训练的模型
model.save('finetuning/mnist')


paddle.Model.save:将模型的参数和训练过程中优化器的信息保存到指定的路径,以及推理所需的参数与文件


继续调优训练


from paddle.static import InputSpec
# 模型封装,为了后面保存预测模型,这里传入了inputs参数
model_2 = paddle.Model(network, inputs=[InputSpec(shape=[-1, 28, 28], dtype='float32', name='image')])
# 加载之前保存的阶段训练模型
model_2.load('finetuning/mnist')
# 模型配置
model_2.prepare(paddle.optimizer.Adam(learning_rate=0.001, parameters=network.parameters()),
                paddle.nn.CrossEntropyLoss(),
                paddle.metric.Accuracy())
# 模型全流程训练
model_2.fit(train_dataset, 
            eval_dataset,
            epochs=2,
            batch_size=64,
            verbose=1)


这里就相当于把之前的几个大的流程再走一遍:封装模型,然后读取之前的模型,模型配置,训练配置然后就可以运行了


保存预测模型


# 保存用于后续推理部署的模型
model_2.save('infer/mnist', training=False)


再次保存。

training=False不再保存其他的训练参数,只保留模型


整理


第一天的课程终于整理结束了,我们也来回顾一下,首先就是对人工智能、机器学习、深度学习进行的一定的解释和梳理,使得有一定的理解,知道什么是AI。

然后对深度学习的流程进行了梳理得到了—深度学习万能开发公式

引出了我们的boos——paddlepaddle

对书写数字识别进行了详细的解析,真·详细

把整个项目掰开,一点一点的进行了分析和梳理


总结


虽然今天是课程的第一天,难度绝对不低,但是收获真的多,花了整整5小时的时间进行了梳理,对整个深度学习的流程有了更加丰富的理解,有一种马上就要恍然大悟但是又有点迷茫的那种状态。

接下的课程更精彩,期待

目录
相关文章
|
1月前
|
机器学习/深度学习 人工智能 安全
探索AI的未来:从机器学习到深度学习
【10月更文挑战第28天】本文将带你走进AI的世界,从机器学习的基本概念到深度学习的复杂应用,我们将一起探索AI的未来。你将了解到AI如何改变我们的生活,以及它在未来可能带来的影响。无论你是AI专家还是初学者,这篇文章都将为你提供新的视角和思考。让我们一起探索AI的奥秘,看看它将如何塑造我们的未来。
73 3
|
1月前
|
机器学习/深度学习 数据采集 人工智能
AI赋能教育:深度学习在个性化学习系统中的应用
【10月更文挑战第26天】随着人工智能的发展,深度学习技术正逐步应用于教育领域,特别是个性化学习系统中。通过分析学生的学习数据,深度学习模型能够精准预测学生的学习表现,并为其推荐合适的学习资源和规划学习路径,从而提供更加高效、有趣和个性化的学习体验。
112 9
|
8天前
|
机器学习/深度学习 人工智能 自然语言处理
GLM-4V-Flash:智谱 AI 免费开放的图像理解大模型 API 接口
智谱AI推出的GLM-4V-Flash是一款专注于图像理解的免费开放大模型,提供API接口支持用户上传图片URL或Base64编码图片获取详细的图像描述。该模型通过深度学习和卷积神经网络技术,简化了图像分析流程,提高了开发效率,适用于内容审核、辅助视障人士、社交媒体、教育和电子商务等多个应用场景。
66 14
GLM-4V-Flash:智谱 AI 免费开放的图像理解大模型 API 接口
|
17天前
|
机器学习/深度学习 人工智能 自然语言处理
揭秘AI:深度学习的奥秘与实践
本文将深入浅出地探讨人工智能中的一个重要分支——深度学习。我们将从基础概念出发,逐步揭示深度学习的原理和工作机制。通过生动的比喻和实际代码示例,本文旨在帮助初学者理解并应用深度学习技术,开启AI之旅。
|
25天前
|
人工智能 Java API
ChatClient:探索与AI模型通信的Fluent API
【11月更文挑战第22天】随着人工智能(AI)技术的飞速发展,越来越多的应用场景开始融入AI技术以提升用户体验和系统效率。在Java开发中,与AI模型通信成为了一个重要而常见的需求。为了满足这一需求,Spring AI引入了ChatClient,一个提供流畅API(Fluent API)的客户端,用于与各种AI模型进行通信。本文将深入探讨ChatClient的底层原理、业务场景、概念、功能点,并通过Java代码示例展示如何使用Fluent API与AI模型进行通信。
46 8
|
1月前
|
机器学习/深度学习 人工智能 算法
AI在医疗:深度学习在医学影像诊断中的最新进展
【10月更文挑战第27天】本文探讨了深度学习技术在医学影像诊断中的最新进展,特别是在卷积神经网络(CNN)的应用。文章介绍了深度学习在识别肿瘤、病变等方面的优势,并提供了一个简单的Python代码示例,展示如何准备医学影像数据集。同时强调了数据隐私和伦理的重要性,展望了AI在医疗领域的未来前景。
72 2
|
2月前
|
人工智能 机器人 API
【通义】AI视界|谷歌Q3财报:Gemini API六个月增长14倍,公司超25%的新代码由AI生成
本文内容由通义自动生成,涵盖谷歌Q3财报、马斯克xAI融资、九巨头联盟挑战英伟达、Meta加大AI投入及麻省理工研究LLM与人脑相似性等热点资讯。更多精彩内容,请访问通通知道。
|
22天前
|
机器学习/深度学习 人工智能 自然语言处理
揭秘深度学习中的自注意力机制及其在现代AI应用中的革新
揭秘深度学习中的自注意力机制及其在现代AI应用中的革新
|
23天前
|
人工智能 Java API
Spring AI Fluent API:与AI模型通信的流畅体验
【11月更文挑战第24天】随着人工智能(AI)技术的飞速发展,越来越多的应用场景开始融入AI技术以提升用户体验和系统效率。在Java开发中,与AI模型通信成为了一个重要而常见的需求。为了满足这一需求,Spring AI引入了ChatClient,一个提供流畅API(Fluent API)的客户端,用于与各种AI模型进行通信。本文将深入探讨ChatClient的底层原理、业务场景、概念、功能点,并通过Java代码示例展示如何使用Fluent API与AI模型进行通信。
34 0
|
26天前
|
Web App开发 人工智能 自然语言处理
WebChat:开源的网页内容增强问答 AI 助手,基于 Chrome 扩展的最佳实践开发,支持自定义 API 和本地大模型
WebChat 是一个基于 Chrome 扩展开发的 AI 助手,能够帮助用户理解和分析当前网页的内容,支持自定义 API 和本地大模型。
63 0