1.2基础-paddlepaddle线性回归

一个简单的paddlepaddle线性回归预测、模型保存、模型加载及使用的过程.


全连接神经网络,fluid.layers.fc:https://www.paddlepaddle.org.cn/documentation/docs/zh/api_cn/layers_cn/fc_cn.html#fc


平方误差,fluid.layers.square_error_cost:https://www.paddlepaddle.org.cn/documentation/docs/zh/api_cn/layers_cn/square_error_cost_cn.html#square-error-cost


随机梯度下降,fluid.optimizer.SGDOptimizer:https://www.paddlepaddle.org.cn/documentation/docs/zh/api_cn/optimizer_cn/SGDOptimizer_cn.html#sgdoptimizer


模型保存,save_inference_model:https://www.paddlepaddle.org.cn/documentation/docs/zh/api_cn/io_cn/save_inference_model_cn.html#save-inference-model


模型加载,load_inference_model:https://www.paddlepaddle.org.cn/documentation/docs/zh/api_cn/io_cn/load_inference_model_cn.html#load-inference-model


import paddle.fluid as fluid
import paddle
import numpy as np

def load_model(inpt):
    # 定义一个简单的线性网络,对输入inpt进行全连接,映射为100维大小
    # batchsize:一批、一组数据的大小
    # 比如输入inpu:[batchsize,13],则hidden:[batchsize,100]
    hidden = fluid.layers.fc(input=inpt, size=100, act='relu')
    # 再全连接,映射为1维大小,作为输出
    # [batchsize,1]
    net = fluid.layers.fc(input=hidden, size=1, act=None)
    return net


def cost(model,label):
    # 定义损失函数,损失需要预测input,真实值label
    # (model-label)^2
    cost = fluid.layers.square_error_cost(input=model, label=label)
    # 为了忽略数量的影响,损失定义为平均损失
    avg_cost = fluid.layers.mean(cost)
    return avg_cost


def optimizer(cost):
    # 定义优化方法为随机梯度下降SGDOptimizer,会对输入cost进行反向梯度,希望cost变得越来越小
    optimizer = fluid.optimizer.SGDOptimizer(learning_rate=0.01)
    opts = optimizer.minimize(cost)
    return opts


def data():
    # 定义训练和测试数据,5条数据,每条13维
    x_data = np.array([[1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
                       [2.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
                       [3.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
                       [4.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
                       [5.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]]).astype('float32')
    # 5条数据的回归y值
    y_data = np.array([[3.0], [5.0], [7.0], [9.0], [11.0]]).astype('float32')
    # 1条测试数据
    test_data = np.array([[6.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]]).astype('float32')
    return x_data, y_data, test_data


def train(epoch, feed, fetch_list, exe):
    # 训练epoch次
    for ei in range(epoch):
        train_cost, o_net = exe.run(program=fluid.default_main_program(),
                                    feed=feed,
                                    fetch_list=fetch_list)
        print("epoch:%d, cost:%0.5f" % (ei, train_cost[0]))


def save(params_dirname='result', feeded_var_names=None, target_vars=None, executor=None):
    '''
    params_dirname:保存的路径
    feeded_var_names:保存模型的输入名称list
    target_vars:模型的输出目标
    executor:模型的执行器
    '''
    print('save model at:',params_dirname)
    fluid.io.save_inference_model(dirname=params_dirname, feeded_var_names=feeded_var_names,
                                  target_vars=target_vars, executor=executor)


def execut(if_cuda=False):
	# 创建执行设备,如果GPU,就使用0号GPU卡,多卡在后面,慢慢来
    place = fluid.CUDAPlace(0) if if_cuda else fluid.CPUPlace()
    exe = fluid.Executor(place)
    return exe


def predict(program, feed_data, fetch_list):
    # 开始预测
    result = exe.run(program=program,
                     feed=feed_data,
                     fetch_list=fetch_list)
    print("当x为6.0时,y为:%0.5f:" % result[0][0][0])


if __name__ == '__main__':
    x = fluid.layers.data(name='x', shape=[13], dtype='float32')
    y = fluid.layers.data(name='y', shape=[1], dtype='float32')
    
    # 创建数据
    x_data, y_data, test_data = data()
    
    # 创建模型
    predict_y = load_model(x)
    
    # 创建当前主程序default_main_program的克隆程序,用于预测:clone(for_test=True)
    test_program = fluid.default_main_program().clone(for_test=True)

    # 创建损失
    avg_cost = cost(predict_y,y)
    
    opts = optimizer(avg_cost)
    
    # 创建执行器
    exe = execut(if_cuda=True)
    # 初始化所以网络参数
    exe.run(fluid.default_startup_program())
    # 开始训练,喂的数据是:{'x': x_data, 'y': y_data},希望输出的是:平均损失avg_cost,模型输出model
    train(epoch=10, feed={'x': x_data, 'y': y_data}, fetch_list=[avg_cost, predict_y], exe=exe)
    # 保存模型,这个模型保存到result,输入的数据要求必须是给x占位的,输出的是模型最后那个return net
    save(params_dirname='result', feeded_var_names=['x'], target_vars=[predict_y], executor=exe)

    predict(program=test_program, feed_data={'x': test_data}, fetch_list=[predict_y])

'''
epoch:0, cost:49.64904
epoch:1, cost:15.40312
epoch:2, cost:2.15408
epoch:3, cost:0.05858
epoch:4, cost:0.03799
epoch:5, cost:0.03717
epoch:6, cost:0.03639
epoch:7, cost:0.03562
epoch:8, cost:0.03488
epoch:9, cost:0.03415
save model at: result
当x为6.0时,y为:13.28173:
'''

模型保存后的样子:
在这里插入图片描述


在别的地方加载之前保存的result模型:

import paddle.fluid as fluid
import numpy as np


def execut(if_cuda):
    place = fluid.CUDAPlace(0) if if_cuda else fluid.CPUPlace()
    exe = fluid.Executor(place)
    return exe


if __name__ == '__main__':
    # 现在需要加载训练好的模型,并且预测2条数据:
    test_data = np.array([[6.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
                          [3.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
                          ]).astype('float32')
    # 创建执行器
    exe = execut(if_cuda=False)
    # 之前保存的模型目录
    params_dirname = "result"
    # 开始加载模型,模型会返回:执行程序,输入数据名列表,返回数据列表
    # ps:所以这里要记得自己之前保存的时候返回多少个数据target_vars=[predict_y],在执行exe.run的左边就设置相应个数接回这些数据
    inference_program, feed_target_names, fetch_targets = fluid.io.load_inference_model(params_dirname, exe)

    results = exe.run(inference_program,
                      feed={"x": test_data},
                      fetch_list=fetch_targets)
    print(results[0])

返回内容:
在这里插入图片描述

原文地址:https://www.cnblogs.com/onenoteone/p/12441680.html