线性回归简洁实现

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

#生成数据集
#调用synthetic_data函数,利用真实w和b生成特征数据集和标签,得到训练样本
features,labels=d2l.synthetic_data(true_w,true_b,100)

#读取数据集(便于后续训练时每次抽取一小批量样本,并使用它们来更新我们的模型)
#调用框架中现有的API来读取数据
def load_array(data_arrays,batch_size,is_train=True):
    #构造数据迭代器
    #TensorDataset与DataLoader这两个类的作用, 就是将数据读入并做整合,以便交给模型处理
    dataset=data.TensorDataset(*data_arrays)
    #TensorDataset是 PyTorch 中的一个工具类,用于将一组张量包装成一个数据集
    #将传入的特征和标签作为list即data_arrays传到TensorDataset里面得到一个数据集
    return data.DataLoader(dataset,batch_size,shuffle=is_train)
    #Dataset:加载的数据集,batch_size:每个批次加载的样本数, shuffle:指定是否在每个 epoch 开始时随机打乱数据。
    #调用Dataloader每次从dataset里面挑选batch_size个样本出来
    #DataLoader则是对数据进行采样、分割等操作,将数据划分为许多组特征张量+对应标签的形式
    #具有划分小批量的功能DataLoader提供了一个简单的方式来迭代地加载数据集,它可以接受任意形式的数组、张量作为输入,并把他们一次性转换为神经网络可以接入的tensor类型。


#读取并打印第一个小批量样本
batch_size=10
data_iter=load_array((features,labels),batch_size)
#将特征和标签作为列表传入load_array的data_arrays,得到batch_size大小的小批量数据集
next(iter(data_iter))
#iter(data_iter)将data_iter转换为迭代器,并将其传递给next()函数
#使用next从迭代器中获取第一项


#定义模型
from torch import nn
#nn是神经网络的缩写
#使用框架的预定义好的层
net=nn.Sequential(nn.Linear(2,1))
#定义一个模型变量net,它是一个Sequential类的实例。 Sequential类将多个层串联在一起。 当给定输入数据时,Sequential实例将数据传入到第一层, 然后将第一层的输出作为第二层的输入,以此类推。
#Sequential类可以看成一个容器包装各层,当一个模型较简单的时候,我们可以使用torch.nn.Sequential类来实现简单的顺序连接模型。
#第一个指定输入特征形状为2,第二个指定输出特征形状为单个标量为1


#初始化模型参数(利用深度学习框架的API)
net[0].weight.data.normal_(0,0.01)
#net[0]表示第0层,.weight访问w,data就是w的值(权重数据的引用,并不包含梯度信息),下划线的意思是使用正态分布,初始化权重的值
#.weight.data是存储模型参数w的Parameter类中的存储权重数据的属性。
net[0].bias.data.fill_(0)
#使用填充0,初始化偏置b的值
#.bias.data表示获取偏置项的数据,神经网络的每一层都有一个对应的偏置项。通常以向量的形式存在,每个元素对应于该层中的一个神经元。

#定义损失函数(利用深度学习框架的API)
loss=nn.MSELoss()
#MSELoss类为平方L2范数,默认情况下,它返回所有样本损失的平均值。


#定义优化算法(利用深度学习框架的API)
#小批量随机梯度下降算法SGD在PyTorch的optim模块中
#实例化一个SGD实例时,我们要指定优化的模型参数 (可通过net.parameters()从模型中获得)以及优化算法所需的超参数字典(如人为指定lr的值)
trainer=torch.optim.SGD(net.parameters(),lr=0.03)
#net.parameters()是一个生成器,用于生成模型net中的所有模型参数(w,b)


#深度学习模型中一般有两类参数:一类需要从数据中学习和估计得到,称为模型参数(Parameter)---即模型本身的参数。比如,线性回归直线的加权系数(斜率w)及其偏差项(截距b)。还有一类则是调优参数(tuning parameters),需要人为设定(根据已有或现有的经验指定“正确”的值),称为超参数(Hyperparameter),它具有参数的特性,比如未知


#模型训练
num_epochs = 3 #迭代3次(3轮)
for epoch in range(num_epochs):
    for X, y in data_iter:
        l = loss(net(X) ,y)#因为net自带参数,所以和之前不同的是不需要再传进去w和b
        trainer.zero_grad()#梯度清零
        l.backward()  #计算梯度
        trainer.step() #调用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)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值