线性回归是预测连续值的一种模型,是机器学习最基础的模型之一。可以看作是单层的神经网络。

1.线性回归模型:

Y=XW+b  X,W,Y均为张量

2.损失函数:

求解真实值和预测值之间的误差,在预测连续值时,我们常使用的损失函数公式为均方误差(平均平方误差),公式如下:

回归系数标准误_回归系数标准误

 我们训练模型的目的就是找出使损失函数值最小的权重参数W和偏置参数b。

回归系数标准误_pytorch_02

参数迭代:求解各个参数的梯度(反向传播),通过梯度下降(优化器)进行参数的更新。

回归系数标准误_python_03

3.梯度下降的方法:

小批量随机梯度下降(SGD):随机选择一个批量的数据进行训练,计算梯度,代替全部样本的数据梯度,节约计算资源。

超参数:批量大小和学习率

4.线性回归的简洁实现-使用PyTorch的API:

步骤:
准备数据集
定义模型
构造损失函数和优化器
训练周期(正向,损失,反向,梯度)

1.准备数据集

import numpy as np
import torch
from torch.utils import data
from d2l import torch as d2l



true_w = torch.tensor([2, -3.4])
true_b = 4.2
# 随机生成自定义数据集
features, labels = d2l.synthetic_data(true_w, true_b, 1000)

# 将数据集转换为数据加载器,方便进行批处理
def load_array(data_arrays, batch_size, is_train=True):  #@save
    """构造一个PyTorch数据迭代器。"""
    # 这一句很重要
    dataset = data.TensorDataset(*data_arrays)
    return data.DataLoader(dataset, batch_size, shuffle=is_train)

batch_size = 10
data_iter = load_array((features, labels), batch_size)  # 返回的为数据加载器


#  这里我们使用iter构造Python迭代器,并使用next从迭代器中获取第一项
print(next(iter(data_iter)))

[tensor([[ 2.1243, -1.3675],
         [-0.2257,  1.9803],
         [ 0.8393,  0.9543],
         [-0.0371, -0.3132],
         [-1.3355,  0.5548],
         [ 0.9073,  0.6476],
         [ 0.7085,  0.0610],
         [-0.0232, -2.1892],
         [ 0.2434,  0.2404],
         [ 0.1947, -0.5472]]),
 tensor([[13.1018],
         [-2.9850],
         [ 2.6245],
         [ 5.1767],
         [-0.3770],
         [ 3.8138],
         [ 5.4174],
         [11.5898],
         [ 3.8586],
         [ 6.4541]])]

2.定义模型

我们首先定义一个模型变量net,它是一个Sequential类的实例。Sequential类为串联在一起的多个层定义了一个容器。当给定输入数据,Sequential实例将数据传入到第一层,然后将第一层的输出作为第二层的输入,依此类推。在下面的例子中,我们的模型只包含一个层,因此实际上不需要Sequential。但是由于以后几乎所有的模型都是多层的,在这里使用Sequential会让你熟悉标准的流水线

from torch import nn

net = nn.Sequential(nn.Linear(2,1))  # (2,1)神经元的个数

3.构造优化器和损失函数

optimizer = torch.optim.SGD(net.parameters(),lr=0.03)
loss = nn.MSELoss()

4.训练周期

num_rpochs = 3
for epoch in range(num_rpochs):
    for X,y in data_iter:
        y_pred = net(X) # 这里取net[0](X) 也是可以的,但如果层数多了的话,写net(X),PyTorch会自动连续计算
        l = loss(y_pred,y)
        optimizer.zero_grad()
        l.backward()
        optimizer.step()
    l = loss(net(features),labels)
    print(f'epoch {epoch + 1}, loss {l:f}')

epoch 1, loss 0.000440 epoch 2, loss 0.000094 epoch 3, loss 0.000094

w = net[0].weight.data # 因为net说一个容器实例变量,而我们又只有一个线性层,所以取[0]
print('w的估计误差:', true_w - w.reshape(true_w.shape))
b = net[0].bias.data
print('b的估计误差:', true_b - b)

w的估计误差: tensor([-0.0005, 0.0001]) b的估计误差: tensor([0.0001])