【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小时的时间进行了梳理,对整个深度学习的流程有了更加丰富的理解,有一种马上就要恍然大悟但是又有点迷茫的那种状态。

接下的课程更精彩,期待

目录
相关文章
|
3月前
|
人工智能 安全 架构师
告别旅行规划的"需求文档地狱"!这个AI提示词库,让你像调API一样定制完美旅程
作为开发者,旅行规划如同“需求地狱”:信息碎片、需求多变、缺乏测试。本文提出一套“企业级”AI提示词库,将模糊需求转化为结构化“API请求”,实现标准化输入输出,让AI成为你的专属旅行架构师,30分钟生成专业定制方案,提升决策质量,降低90%时间成本。
538 129
|
2月前
|
人工智能 API 开发工具
构建AI智能体:一、初识AI大模型与API调用
本文介绍大模型基础知识及API调用方法,涵盖阿里云百炼平台密钥申请、DashScope SDK使用、Python调用示例(如文本情感分析、图像文字识别),助力开发者快速上手大模型应用开发。
1252 16
构建AI智能体:一、初识AI大模型与API调用
|
5月前
|
人工智能 自然语言处理 算法
AI与API结合:自动解析商品描述+情感分析评论数据
AI与API深度融合正在重塑电商运营模式。通过自动解析商品描述、分析评论情感,企业可实现信息标准化、用户画像精准化及运营决策自动化。本文从技术架构、核心算法、实战案例三方面,详解AI如何驱动电商智能化升级。
|
5月前
|
人工智能 供应链 安全
AI驱动攻防升级,API安全走到关键档口
在AI与数字化转型加速背景下,API已成为企业连接内外业务的核心枢纽,但其面临的安全威胁也日益严峻。瑞数信息发布的《API安全趋势报告》指出,2024年API攻击流量同比增长162%,占所有网络攻击的78%。攻击呈现规模化、智能化、链式扩散等新特征,传统防护手段已难应对。报告建议企业构建覆盖API全生命周期的安全体系,强化资产梳理、访问控制、LLM防护、供应链管控等七大能力,提升动态防御水平,保障AI时代下的业务安全与稳定。
199 0
|
5月前
|
人工智能 自然语言处理 API
AI与Web3.0时代:API如何定义下一代企业数据交互?
简介: 2025年,API作为企业数据交互的“通用语言”,正推动各行各业的智能化与自动化变革。从技术架构到商业价值,CTO如何把握API浪潮,构建开放生态、提升安全合规、驱动业务增长?本文深入探讨API的战略意义与实战策略,助力企业抢占未来竞争制高点。
|
5月前
|
人工智能 算法 搜索推荐
电商API的“AI革命”:全球万亿市场如何被算法重新定义?
AI+电商API正引领智能商业变革,通过智能推荐、动态定价与自动化运营三大核心场景,大幅提升转化率、利润率与用户体验。2025年,75%电商API将具备个性化能力,90%业务实现智能决策,AI与API的深度融合将成为未来电商竞争的关键基石。
|
3月前
|
人工智能 Java 机器人
基于Spring AI Alibaba + Spring Boot + Ollama搭建本地AI对话机器人API
Spring AI Alibaba集成Ollama,基于Java构建本地大模型应用,支持流式对话、knife4j接口可视化,实现高隐私、免API密钥的离线AI服务。
2709 1
基于Spring AI Alibaba + Spring Boot + Ollama搭建本地AI对话机器人API
|
3月前
|
人工智能 数据可视化 测试技术
AI 时代 API 自动化测试实战:Postman 断言的核心技巧与实战应用
AI 时代 API 自动化测试实战:Postman 断言的核心技巧与实战应用
506 11
|
3月前
|
人工智能 API
阿里云百炼API-KEY在哪查询?如何获取阿里云AI百炼大模型的API-KEY?
阿里云百炼是阿里云推出的AI大模型平台,用户可通过其管理控制台获取API-KEY。需先开通百炼平台及大模型服务,即可创建并复制API-KEY。目前平台提供千万tokens免费额度,详细操作流程可参考官方指引。
|
5月前
|
机器学习/深度学习 人工智能 PyTorch
AI 基础知识从 0.2 到 0.3——构建你的第一个深度学习模型
本文以 MNIST 手写数字识别为切入点,介绍了深度学习的基本原理与实现流程,帮助读者建立起对神经网络建模过程的系统性理解。
641 15
AI 基础知识从 0.2 到 0.3——构建你的第一个深度学习模型