总结4(9.27-10.3)

这篇博客介绍了如何利用深度学习框架PyTorch实现线性回归模型。首先,生成了基于真实权重和偏差的数据集,然后定义了数据加载器。接着,构建了一个简单的线性模型,并使用随机梯度下降进行训练。经过5个训练轮次,模型的损失逐渐减小,最终得到的权重和偏差估计值接近真实值。博客还展示了如何绘制数据散点图以直观地查看线性关系。
摘要由CSDN通过智能技术生成

        本周主要对线性回归模型进行了学习和实现,将通过深度学习框架来简洁的实现。线性回归基于几个简单的假设:首先,假设自变量𝐱和因变量𝑦之间的关系是线性的,即𝑦可以表示为𝐱中元素的加权和,这里通常允许包含观测值的一些噪声;其次,我们假设任何噪声都比较正常,如噪声遵循正态分布。

       这里我们使用线性模型参数𝐰=[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])

   总结:这周由于电脑出了一点问题加上国庆放假,并没有学太多东西。主要学习了小批量随机下降算法以及其代码应用。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值