• 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])
    

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

  • 相关阅读:
    蓝桥杯历届试题 幸运数 链表模拟
    最小路径覆盖和最小边覆盖及相关性质
    HDU 1724 Ellipse 自适应simpson积分
    [kuangbin带你飞]专题六 最小生成树 POJ 2421 Constructing Roads
    [ An Ac a Day ^_^ ][kuangbin带你飞]专题六 最小生成树 POJ 2031 Building a Space Station
    Codeforces Round #390 (Div. 2)
    数据结构 有向图的非递归遍历
    数据结构 二叉树
    vi/vim基本使用方法
    网络赛用头文件
  • 原文地址:https://www.cnblogs.com/onenoteone/p/12441680.html
Copyright © 2020-2023  润新知