paddle2.3实现回归模型

        近期在研究AI方面的东西,打算做一点智能分析或者自动分析方面的功能,近几年深度学习异常火爆,各个大厂相继入场,开发框架,发论文,好不热闹,但是落地应用还需要各个行业内的人去慢慢实现。

框架选择

        做深度学习框架必不可少,因为一些重复的工作框架已经帮我们实现好,我们只需要构建自己的神经网络,准备数据训练即可。目前主流的框架有pytorch,tensorflow,国内百度有paddlepaddle,华为有mindspore,paddle作为国内起步比较早的框架,生态已经非常成熟,api也很好上手,虽然网上的教程不多,但是官网的教程和文档非常完备,结合pytorch和tensorflow的优点,动静态图结合,同时支持分布式训练,所以我选择了paddle。

实例

        下面是我用paddle实现的一个回归的例子

import paddle
from paddle import nn
import numpy as np
from paddle import to_tensor
import matplotlib.pyplot as plt
from paddle.nn.functional import square_error_cost as sqrc
from visualdl import LogWriter
# 创建 LogWriter 对象,指定 logdir 参数,如果指定路径不存在将会创建一个文件夹
logwriter = LogWriter(logdir='./paddlets_test/reg')



x = np.linspace(0,1,100).astype("float32")
y = np.sin(np.pi*x)+0.3

plt.scatter(x,y)
#增加数据维度,变成N*1的形状,深度学习一般至少是二维数据
x_data = x[:,None]
y_data = y[:,None]


print(x_data.dtype)
print(y_data.dtype)
mynet_Sequential = nn.Sequential(
    nn.Linear(1, 32),
    nn.Tanh(),
    nn.Linear(32, 32),
    nn.Tanh(),
    nn.Linear(32, 32),
    nn.Tanh(),
    nn.Linear(32, 10),
    nn.Tanh(),
    nn.Linear(10, 1),

)
#mynet_Sequential.train()
x_data_train = to_tensor(x_data)
y_data_train = to_tensor(y_data)
loss_func =  paddle.nn.loss.MSELoss() #损失函数为均方差
optimizer = paddle.optimizer.SGD(learning_rate=0.01,parameters=mynet_Sequential.parameters())


for pass_id in range(5000):
    out = mynet_Sequential(x_data_train)
    loss = loss_func(out,y_data_train)
    logwriter.add_scalar("train_avg_loss", value=loss.numpy(), step=pass_id)
    logwriter.add_histogram("fc_weight", values=mynet_Sequential.parameters()[1].numpy(), step=pass_id)
    loss.backward()
    optimizer.minimize(loss)
    optimizer.step()
    optimizer.clear_grad()
    if pass_id %1000 == 0:
        print("pass:%d, Cost:%.5f" % (pass_id,loss))

paddle.jit.save(mynet_Sequential,"./paddlets_test/model",[paddle.static.InputSpec([-1,1])])
logwriter.add_hparams(hparams_dict={'lr': 0.01, 'batch_size':100,'opt': 'sgd'},
                           metrics_list=['train_avg_loss','test_avg_loss','test_avg_acc'])

y_test = mynet_Sequential(x_data_train)
y_value = y_test.numpy()
#print(y_value)
y_1d = [item[0] for item in y_value]
plt.plot(x_data,y_1d,color='r')

                                      

 经过5000次的训练,可以看到拟合效果还不错。

因为训练过程中加入了日志,所以还可以用visualdl进行可视化网络结构、参数、loss等训练指标。

loss

 网络结构

参数

总的来说,paddle体验还不错,工具完善,api好上手,特别是现在科技边界(国界)变得明显,国产化越来越重要,感兴趣的朋友可以试试。

猜你喜欢

转载自blog.csdn.net/zy1620454507/article/details/128834252