线性回归是预测连续值的一种模型,是机器学习最基础的模型之一。可以看作是单层的神经网络。
1.线性回归模型:
Y=XW+b X,W,Y均为张量
2.损失函数:
求解真实值和预测值之间的误差,在预测连续值时,我们常使用的损失函数公式为均方误差(平均平方误差),公式如下:
我们训练模型的目的就是找出使损失函数值最小的权重参数W和偏置参数b。
参数迭代:求解各个参数的梯度(反向传播),通过梯度下降(优化器)进行参数的更新。
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])