深度学习(一):准备及基础概念
人工智能、机器学习和深度学习三者关系
神经网络基本概念
深度学习开发万能公式
深度学习一般过程
学习率衰减:学习率先大后小。
学习率太大会错过最优点。
深度学习开发万能公式(问题定义——数据准备——模型选择和开发——模型训练和调优——模型评估测试——部署上线)
数据准备:数据清洗、数据填补、数据切分(训练、测试)
飞浆框架(2.0)
轻松实践——手写数字识别
Sequential:快速堆叠网络
Subclass:自定义和组织
高层API框架内置模型:直接调用模型
paddle.Model;
model.prepared;
model.fit
model.evaluate;
model.predict
代码:
#!/usr/bin/env python
# coding: utf-8
# # 导入相关库
# In[1]:
import paddle
import numpy as np
import matplotlib.pyplot as plt
paddle.__version__
# # ② 数据准备
#
# ## 2.1 数据加载和预处理
# In[2]:
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)))
# ## 2.2 数据集查看
# In[3]:
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()
# # ③ 模型选择和开发
#
# ## 3.1 模型组网
#
# 
# In[4]:
# 模型网络结构搭建
network = paddle.nn.Sequential(
paddle.nn.Flatten(), # 拉平,将 (28, 28) => (784)
paddle.nn.Linear(784, 512), # 隐层:线性变换层
paddle.nn.ReLU(), # 激活函数
paddle.nn.Linear(512, 10) # 输出层
)
# ## 模型网络结构可视化
# In[5]:
# 模型封装
model = paddle.Model(network)
# 模型可视化
model.summary((1, 28, 28))
# In[38]:
# 配置优化器、损失函数、评估指标
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) # 日志展示形式
# # ⑤ 模型评估测试
#
# ## 5.1 模型评估
# In[40]:
# 模型评估,根据prepare接口配置的loss和metric进行返回
result = model.evaluate(eval_dataset, verbose=1)
print(result)
# ## 5.2 模型预测
# ### 5.2.1 批量预测
#
# 使用model.predict接口来完成对大量数据集的批量预测。
# In[48]:
# 进行预测操作
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]))
# ### 5.2.2 单张图片预测
#
# 采用model.predict_batch来进行单张或少量多张图片的预测。
# In[52]:
# 读取单张图片
image = eval_dataset[501][0]
# 单张图片预测
result = model.predict_batch([image])
# 可视化结果
show_img(image, np.argmax(result))
# # ⑥ 部署上线
#
# ## 6.1 保存模型
# In[54]:
# 保存用于后续继续调优训练的模型
model.save('finetuning/mnist')
# ## 6.2 继续调优训练
# In[56]:
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)
# ## 6.3 保存预测模型
# In[58]:
# 保存用于后续推理部署的模型
model_2.save('infer/mnist', training=False)