线性回归是利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法,运用十分广泛。其表达形式为y = w'x+e,e为误差服从均值为0的正态分布。
1.引入必要的运行包:
#引入paddle的包
import paddle.fluid as fluid
import paddle
import numpy as np #引入数学计算的包
# 定义变量,变量的shape为13维,类型为float32,也可以是float64啥的
x=fluid.layers.data(name='x',shape=[13],dtype='float32')
# 个人理解,定义标签的内容
y = fluid.layers.data(name='y', shape=[1], dtype='float32')
#定义一个全链接的隐藏层,激活函数为:relu
/*
paddle.fluid.layers.fc(input, size, num_flatten_dims=1, param_attr=None, bias_attr=None, act=None, name=None)
全连接层
参数:
input (Variable|list of Variable) – 维度为 [N1,N2,...,Nk][N1,N2,...,Nk] 的多维Tensor(或LoDTensor)或由多个Tensor(或LoDTensor)组成的list,输入Tensor的shape至少是2。数据类型为float32或float64。
size (int) – 全连接层输出单元的数目,即输出Tensor(或LoDTensor)特征维度。
num_flatten_dims (int) – 输入可以接受维度大于2的Tensor。在计算时,输入首先会被扁平化(flatten)为一个二维矩阵,之后再与权重(weights)相乘。参数 num_flatten_dims 决定了输入Tensor的flatten方式: 前 num_flatten_dims (包含边界,从1开始数) 个维度会被扁平化为二维矩阵的第一维 (即为矩阵的高), 剩下的 rank(X)−num_flatten_dimsrank(X)−num_flatten_dims 维被扁平化为二维矩阵的第二维 (即矩阵的宽)。 例如, 假设X是一个五维的Tensor,其shape为(2, 3, 4, 5, 6), 若 num_flatten_dims=3num_flatten_dims=3 ,则扁平化的矩阵shape为: (2x3x4,5x6)=(24,30)(2x3x4,5x6)=(24,30) ,最终输出Tensor的shape为 (2,3,4,size)(2,3,4,size) 。默认为1。
param_attr (ParamAttr) – 指定权重参数属性的对象。默认值为None,表示使用默认的权重参数属性。具体用法请参见 ParamAttr 。
bias_attr (ParamAttr) – 指定偏置参数属性的对象。默认值为None,表示使用默认的偏置参数属性。具体用法请参见 ParamAttr 。
act (str) – 应用于输出上的激活函数,如tanh、softmax、sigmoid,relu等,支持列表请参考 激活函数 ,默认值为None。
name (str,可选) – 具体用法请参见 Name ,一般无需设置,默认值为None。
*/
hidden=fluid.layers.fc(input=x,size=100,act='relu')
#定义输出网络层,一维
net = fluid.layers.fc(input=hidden,size=1,act=None)
# 定义优化器
#以下用于计算预测值和目标值的方差估计(input 预测值,label 目标值)
/*
参数:
input (Variable) - 预测值,维度为 [N1,N2,...,Nk,D][N1,N2,...,Nk,D] 的多维Tensor,其中最后一维D是类别数目。数据类型为float32或float64。
label (Variable) - 目标值,维度为 [N1,N2,...,Nk,D][N1,N2,...,Nk,D] 的多维Tensor,其中最后一维D是类别数目。数据类型为float32或float64。
*/
cost = fluid.layers.square_error_cost(input=net, label=y)
#计算所有元素的平均值
/*
参数:
x (Variable) : Tensor 或 LoDTensor。均值运算的输入。
name (basestring | None) : 输出变量的名称。
返回:
Variable: 包含输出均值的 Tensor / LoDTensor。
返回类型:
Variable(变量)。
*/
avg_cost = fluid.layers.mean(cost)
# 该接口实现随机梯度下降算法的优化器,定义优化方法,学习率为0.01(一般为此值,此值影响学习效率)
#SGD 是实现 随机梯度下降 的一个 Optimizer 子类,是 梯度下降 大类中的一种方法。 当需要训练大量样本的时候,往往选择 SGD 来使损失函数更快的收敛。
optimizer = fluid.optimizer.SGDOptimizer(learning_rate=0.01)
opts = optimizer.minimize(avg_cost)
# 创建一个使用CPU的解释器
place = fluid.CPUPlace()
exe = fluid.Executor(place)
# 进行参数初始化
exe.run(fluid.default_startup_program())
# 定义训练数据 y_data 为标签 x_data为数据,每一个[]包括13个数据
x_data = np.array([[1.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],
[2.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],
[3.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],
[4.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],
[5.0, 6.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')
y_data = np.array([[3.0], [5.0], [7.0], [9.0], [11.0]]).astype('float32')
#下面进行训练,进行20次训练
for pass_id in range(20):
train_cost = exe.run(program=fluid.default_main_program(),
feed={'x': x_data, 'y': y_data},
fetch_list=[avg_cost])
print("Pass:%d, Cost:%0.5f" % (pass_id, train_cost[0]))
#克隆一个program进行测试
test_program = fluid.default_main_program().clone(for_test=True)
# 开始预测
#定义测试数据
test_data = np.array([[7.0, 8.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')
result = exe.run(program=test_program,
feed={'x': test_data, 'y': np.array([[0.0]]).astype('float32')}, # y 仅使用同一个类型的占位使用
fetch_list=[net])
print("当x为7.0时,y为:%0.5f" % result[0][0][0])
执行后,打印结果显:
ass:0, Cost:55.13420
Pass:1, Cost:0.69831
Pass:2, Cost:0.22522
Pass:3, Cost:0.12459
Pass:4, Cost:0.06046
Pass:5, Cost:0.03912
Pass:6, Cost:0.02799
Pass:7, Cost:0.02345
Pass:8, Cost:0.02114
Pass:9, Cost:0.01998
Pass:10, Cost:0.01926
Pass:11, Cost:0.01876
Pass:12, Cost:0.01835
Pass:13, Cost:0.01798
Pass:14, Cost:0.01763
Pass:15, Cost:0.01729
Pass:16, Cost:0.01697
Pass:17, Cost:0.01665
Pass:18, Cost:0.01633
Pass:19, Cost:0.01600
当x为7.0时,y为:14.71384