百度 AI Studio——《高层API助你快速上手深度学习》课程学习2
直播地址👉http://live.bilibili.com/21689802
AI Studio实践平台
通过AI Studio可以便捷的调试基于Paddle的神经网络,而且一些课程、项目的链接都可以在这上边找到,鉴于之前学TensorFlow的过程,AI Studio平台上的内容很有营养;
用AI毕竟不是开发AI,多读API、多看优秀项目示例;
第一节直播课
- 人工智能:人类想要达成的目标
- 机器学习:人工智能达成的一个手段
- 深度学习:机器学习的一种方法
神经网络的基本概念:
- 神经元:神经网络中的每个节点称为神经元,由加权和、非线性变换(激活函数)组成;
- 多层链接:大量的神经元按照不同的层次排布,形成多层的结构连接起来,即成为神经网络;
- 前向计算和反向传播:网络的输出计算和参数更新;
深度学习的应用:AI+
- AI摄像头、服务机器人
- 在线测评、智能批改、拍照搜题
- 电网动态仿真、高精度视觉巡查机器人
- 工业质检机器人、工业云关联算法
- 风险控制、保险理赔、移动支付
- 影像辅助诊断、语音电子病例、导诊机器人
- 视觉导航AGV、AI质检产品
- 高清摄像头车辆识别、智能停车
- 人脸考勤、访客管理、人口管控
- 社会治理、警务刑侦、建筑楼宇
工作内容 | 建模 | 平台框架 |
---|---|---|
假设一种网络 | 设计网络结构 | 网络模块的实现(Layer、Tensor),原子函数的实现(Numpy) |
设计评价函数(Loss) | 指定Loss函数 | Loss函数实现(CrossEntropyLoss) |
寻找优化寻解方法 | 指定优化算法 | 优化算法实现(optimizer) |
准备训练数据 | 提供数据格式与位置,模型接入数据方式 | 为模型批量送入数据(io.Dataset、io.DataLoader) |
训练配置 | 单机与多机配置 | 单机到多机的切换(transpile),训练程序的实现(run) |
部署应用或测试环境 | 确定保存模型和加载模型的环节点 | 保存模型实现(save/load、jit.save/jit.load) |
评估模型效果 | 指定评估指标 | 指标实现(Accuracy)、图像化工具(VisualDL) |
深度学习的一般过程:
- 问题定义:对显示问题进行分析,直接影响算法的选择、模型评估标准,投入时间
- 数据准备:
- 数据范围定义:适配任务的所需信息
- 数据获取:下载、清洗
- 数据的预处理:预处理、增强
- 数据集的定义和切分:训练、评估、测试集
- 模型选择和开发
- 对应问题适合的模型选用,寻找或编写对应的模型代码
- 模型训练和调优
- 使用数据集启动对模型的训练
- 围绕业务所需的模型目标进行模型调优
- 模型评估测试
- 对训练好的模型进行评估测试
- 验证模型是否达到业务需求
- 部署上线
- 模型存储、导出、推理服务部署
- 线上系统对接,指标监控
pp飞桨:
- 问说双飞桨,翩然下广津——朱熹
- 可以在多种硬件平台上使用,也支持由这些硬件组成的分布式集群上
- 官网:https://www/paddlepaddle.org.cn/
- Github:https://github.com/PaddlePaddle/Paddle
2.0版本:
- 体系化:19大类、功能完善
- 间接性:一体化高层&底层API
- 兼容性:可兼容历史版本
静态图和静态图:
- 动态图模型:边构图 边计算 很灵活的调试运行(training=True)
- 静态图模型:部署的使用使用的(training=False)
深度学习中的HelloWorld:手写数字识别
## 导入相关库
import paddle
import numpy as np
import matplotlib.pyplot as plt
paddle.__version__
## 数据加载和预处理
import paddle.vision.transforms as T
# 数据的加载和预处理(归一化-1~1)
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)))
## 数据集查看
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()
# 模型网络结构搭建
network = paddle.nn.Sequential(
paddle.nn.Flatten(), # 拉平,将 (28, 28) => (784)
paddle.nn.Linear(784, 512), # 隐层:线性变换层
paddle.nn.ReLU(), # 激活函数
paddle.nn.Linear(512, 10) # 输出层
)
## 模型网络结构可视化
# 模型封装
model = paddle.Model(network)
# 模型可视化
model.summary((1, 28, 28))
# 配置优化器、损失函数、评估指标
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) # 日志展示形式
## 模型评估测试
# 模型评估,根据prepare接口配置的loss和metric进行返回
result = model.evaluate(eval_dataset, verbose=1)
print(result)
## 模型预测
# 进行预测操作——批量预测
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]))
## 单张图片预测
# 读取单张图片
image = eval_dataset[501][0]
# 单张图片预测
# 采用model.predict_batch来进行单张或少量多张图片的预测
result = model.predict_batch([image])
# 可视化结果
show_img(image, np.argmax(result))
## 部署上线
# 保存用于后续继续调优训练的模型
model.save('finetuning/mnist')
# 继续调优训练
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)