本周主要对线性回归模型进行了学习和实现,将通过深度学习框架来简洁的实现。线性回归基于几个简单的假设:首先,假设自变量𝐱和因变量𝑦之间的关系是线性的,即𝑦可以表示为𝐱中元素的加权和,这里通常允许包含观测值的一些噪声;其次,我们假设任何噪声都比较正常,如噪声遵循正态分布。
这里我们使用线性模型参数𝐰=[2,−3.4]⊤、𝑏=3.2和噪声项ϵ生成数据集及其标签:𝐲=𝐗𝐰+𝑏+𝜖来进行实验。
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 = 3.2
features, labels = d2l.synthetic_data(true_w, true_b, 1000)#生成1000个数据集
2.读取数据集
def load_array(data_arrays, batch_size, is_train=True): #布尔值is_train表示是否希望数据迭代器对象在每个迭代周期内打乱数据。
dataset = data.TensorDataset(*data_arrays)##*表示解开list入参
return data.DataLoader(dataset, batch_size, shuffle=is_train)#重新排序,每次挑选batch_size个出来。即小批量的选取
batch_size = 10
data_iter = load_array((features, labels), batch_size)
next(iter(data_iter))#next() 返回迭代器的下一个项目。
shuffle=True:表示随机选取
shuffle=Flase:表示顺序选取
可用以下函数对数据画散点图观察数据的线性关系:
d2l.set_figsize()
d2l.plt.scatter(features[:, (0)].numpy(), labels.numpy(),1,c='b');
d2l.plt.scatter(features[:, (1)].numpy(), labels.numpy(),1,c='g');
可以看到特征数据分别与标签成正比和反比刚好对应着w的值。
3.定义模型和算法
from torch import nn ##nn就是神经网络
net = nn.Sequential(nn.Linear(2, 1))
##模型参数初始化
net[0].weight.data.normal_(0, 0.01)#net[0]为网络中第一个图层
net[0].bias.data.fill_(0)
loss = nn.MSELoss() #损失函数,均方误差
trainer = torch.optim.SGD(net.parameters(), lr=0.03)#优化算法选取和模型参数更新。lr:学习速率
nn.Sequential
类为串联在一起的多个层定义了一个容器。当给定输入数据,Sequential
实例将数据传入到第一层,然后将第一层的输出作为第二层的输入,依此类推。相当于一个list,把层按顺序放在一起。这里线性回归模型只有一层也可以不用Sequential。
4.训练
num_epochs = 5 #训练次数
for epoch in range(num_epochs):
for X, y in data_iter: #取出1个小批量(10个样本)去训练模型
l = loss(net(X) ,y)
trainer.zero_grad() #梯度清零
l.backward()
trainer.step() #模型更新
l = loss(net(features), labels)
print(f'epoch {epoch + 1}, loss {l:f}')
#误差计算
w = net[0].weight.data
print('w的估计误差:', true_w - w.reshape(true_w.shape))
b = net[0].bias.data
print('b的估计误差:', true_b - b)
5.结果
epoch 1, loss 0.000229
epoch 2, loss 0.000100
epoch 3, loss 0.000101
epoch 4, loss 0.000100
epoch 5, loss 0.000100
w的估计误差: tensor([-0.0002, 0.0010])
b的估计误差: tensor([-0.0007])
总结:这周由于电脑出了一点问题加上国庆放假,并没有学太多东西。主要学习了小批量随机下降算法以及其代码应用。