PaddlePaddle基本用法详解(三)、PaddlePaddle增量模型训练与保存
1、01_增量模型训练与保存.py
# 线性回归增量训练、模型保存、固化
import paddle
import paddle.fluid as fluid
import numpy as np
import matplotlib.pyplot as plt
import os
train_data = np.array([[0.5], [0.6], [0.8], [1.1], [1.4]]).astype('float32')
y_true = np.array([[5.0], [5.5], [6.0], [6.8], [6.8]]).astype('float32')
# 定义数据数据类型
x = fluid.layers.data(name="x", shape=[1], dtype="float32")
y = fluid.layers.data(name="y", shape=[1], dtype="float32")
# 通过全连接网络进行预测
y_predict = fluid.layers.fc(input=x, size=1, act=None)
# 添加损失函数
cost = fluid.layers.square_error_cost(input=y_predict, label=y)
avg_cost = fluid.layers.mean(cost) # 求均方差
# 定义优化方法
optimizer = fluid.optimizer.SGD(learning_rate=0.01)
optimizer.minimize(avg_cost) # 指定最小化均方差值
# 搭建网络
place = fluid.CPUPlace() # 指定在CPU执行
exe = fluid.Executor(place)
exe.run(fluid.default_startup_program()) # 初始化系统参数
model_save_dir = "./model/lr_persis/" # 定义保存增量模型的目录(如果目录已经存在,则加载模型)
if os.path.exists(model_save_dir):
fluid.io.load_persistables(exe, # 执行器
model_save_dir, # 模型保存地址
fluid.default_main_program())
print("加载增量模型成功.")
# 开始迭代训练
costs = []
iters = []
values = []
params = {"x": train_data, "y": y_true}
for i in range(500):
outs = exe.run(feed=params, # 喂入的数据
fetch_list=[y_predict.name, avg_cost.name]) # 要得到的数据
iters.append(i) # 迭代次数
costs.append(outs[1][0]) # 损失值
print("%d: %f" % (i, outs[1][0]))
# 损失函数可视化
plt.figure("Trainging")
plt.title("Training Cost", fontsize=24)
plt.xlabel("Iter", fontsize=14)
plt.ylabel("Cost", fontsize=14)
plt.plot(iters, costs, color="red", label="Training Cost") # 绘制损失函数曲线
plt.grid() # 绘制网格线
plt.savefig("train.png") # 保存图片
# plt.legend()
# plt.grid() # 绘制网格线
# plt.savefig("infer.png") # 保存图片
# plt.show() # 显示图片
print("训练完成.")
# 保存增量模型
if not os.path.exists(model_save_dir): # 如果存储模型的目录不存在,则创建
os.makedirs(model_save_dir)
fluid.io.save_persistables(exe, # 执行器
model_save_dir, # 增量模型要保存的路径
fluid.default_main_program())
print("保存增量模型成功.")
# 保存最终模型
freeze_dir = "./model/lr_freeze/" # 即预测模型和保存位置
if not os.path.exists(freeze_dir): # 如果存储模型的目录不存在,则创建
os.makedirs(freeze_dir)
fluid.io.save_inference_model(freeze_dir, # 保存模型的路径
["x"], # 预测需要喂入的数据
[y_predict], # 保存预测结果的变量
exe) # 模型
print("模型保存成功.")
2、02_模型的加载与使用.py
# 增量模型加载
import paddle
import paddle.fluid as fluid
import numpy as np
import math
import os
import matplotlib.pyplot as plt
train_data = np.array([[0.5], [0.6], [0.8], [1.1], [1.4]]).astype('float32')
y_true = np.array([[5.0], [5.5], [6.0], [6.8], [6.8]]).astype('float32')
# 模型预测
infer_exe = fluid.Executor(fluid.CPUPlace()) # 创建用于预测的Executor
infer_result = [] #预测值列表
freeze_dir = "./model/lr_freeze/"
[infer_program, feed_target_names, fetch_targets] = \
fluid.io.load_inference_model(freeze_dir, # 模型保存路径
infer_exe) # 要执行模型的Executor
tmp = np.random.rand(10, 1) # 生成10行1列的均匀随机数组
tmp = tmp * 2 # 范围放大到0~2之间
tmp.sort(axis=0) # 排序
x_test = np.array(tmp).astype("float32")
x_name = feed_target_names[0] # 模型中保存的输入参数名称
# 执行预测
y_out = infer_exe.run(infer_program, # 预测program
feed={x_name: x_test}, # 喂入预测的值
fetch_list=fetch_targets) # 预测结果
y_test = y_out[0]
# 线性模型可视化
plt.figure("Inference")
plt.title("Linear Regression", fontsize=24)
plt.plot(x_test, y_test, color="red", label="inference") # 绘制模型线条
plt.scatter(train_data, y_true) # 原始样本散点图
plt.legend()
plt.grid() # 绘制网格线
plt.savefig("infer.png") # 保存图片
plt.show() # 显示图片