一元线性回归与ONNX格式导出预测
PaddlePaddle提供了在线训练平台,避免了一系列环境的依赖,非常Nice,并且语法与pytorch类似,减少了学习成本。
本文记录PaddlePaddle中简单的一元线性回归案例与ONNX格式导出,后续部署在嵌入式平台。
在线平台:AI Studio 地址
1.生成数据集
import numpy as np
import matplotlib.pyplot as plt
import paddle
from paddle.io import Dataset
number = 5000
x = np.linspace(-100,100,number)
y = 2*x+1+np.random.normal(-10,10,size=number)
plt.scatter(x,y)
plt.xlabel("x number")
plt.ylabel("y real number")
plt.title("x & y scatter graph")
plt.show()
2.完善数据集与模型
class Dataset(paddle.io.Dataset):
# 重写数据集初始化函数
def __init__(self, smaples_num):
super(Dataset, self).__init__()
self.smaples_num = smaples_num
# 重写生成样本的函数
def __getitem__(self, index):
data = paddle.to_tensor(x[index])
label = paddle.to_tensor(y[index])
return data, label
# 重写返回数据集大小的函数
def __len__(self):
return self.smaples_num
dataset = Dataset(number)
class MyNet(paddle.nn.Layer):
def __init__(self):
super(MyNet,self).__init__()
self.dense1 = paddle.nn.Linear(1,100)
self.dense2 = paddle.nn.Linear(100,1,None)
def forward(self,x):
x=self.dense1(x)
x=self.dense2(x)
return x
mynet = MyNet()
3.模型训练
这里使用了PaddlePaddle的高级API实现
from paddle.metric import Accuracy
model = paddle.Model(mynet) # 用Model封装模型
optim = paddle.optimizer.Adam(learning_rate=0.0001, parameters=model.parameters())
# 配置模型
model.prepare(optim, paddle.nn.MSELoss())
model.fit(dataset, epochs=100, batch_size=100)
4.模型预测
x = np.linspace(300,400,100)
x_tensor = paddle.to_tensor(x,dtype='float32')
y_predict = model.predict(x_tensor)
y = []
for i in range(100):
y.append(y_predict[0][i][0])
plt.plot(x,y)
plt.show()
我们也可以使用单独的数字来预测。
data = 400
x_tensor = paddle.to_tensor(data,dtype='float32')
y_predict = model.predict(x_tensor)
print(y_predict)
5.ONNX导出
我这边模型输入就是一维的,所以是[1],并且为float32,x代表输入的名称,后面在onnx预测时会使用。
save_path = 'onnx.save/mynet' # 需要保存的路径
x_spec = paddle.static.InputSpec([1], 'float32', 'x') # 为模型指定输入的形状和数据类型,支持持 Tensor 或 InputSpec ,InputSpec 支持动态的 shape。
paddle.onnx.export(mynet, save_path, input_spec=[x_spec], opset_version=11)
6.ONNX预测
注意这里需要安装ONNX包
打开终端安装即可
pip install onnxruntime
预测代码如下:
import onnxruntime
session = onnxruntime.InferenceSession("/home/aistudio/onnx.save/mynet.onnx")
# 获取模型输入信息
inputs = session.get_inputs()
# 打印模型输入信息
for inp in inputs:
print("Input Name:", inp.name)
print("Input Shape:", inp.shape)
print("Input Type:", inp.type)
# 定义整数输入
x = 900.0
# 将输入转换为浮点数类型
input_data = np.array([float(x)], dtype=np.float32)
print(input_data)
# 将数据传递给模型进行推理
output = session.run(None, {"x": input_data})
print(output)
结果吻合,我们这个就是y=2x+1。
项目地址:https://aistudio.baidu.com/aistudio/projectdetail/6127734?contributionType=1
后续将部署在全志平台,继续研究。