首页 > 其他分享 >002 线性回归的简洁实现

002 线性回归的简洁实现

时间:2023-05-18 09:55:20浏览次数:33  
标签:简洁 nn batch 002 参数 线性 net data size

1. 创建数据集

数据集的手工创建和上一节一样,人为设置true_w,true_b,以及num_examples(样本的总数量),调用synthetic_data()函数来创建。上一节中我们已经用#@save将这个函数保存在了d2l包中,这里我们直接调用就可以了:

2. 读取数据集

load_array()这个函数接受数据集的features,labels以及batch_size作为参数,返回一个数据加载器DataLoader,参数data_arrays就是features以及labels构成的元组(tuple)。我们用data_iter作为名字接住返回的这个DataLoader,并且由于load_array的定义包含了batch_size,所以data_iter能够按batch_size从数据集中加载数据。

data.TensorDataset(*data_arrays)用于对tensor进行打包,包装成dataset,dataset = data.TensorDataset(*data_arrays)也就生成了数据集。DataLoader()函数中,要以参数的形式指明要加载的数据集、batch_size,以及是否随机训练。这里我们使用iter构造Python迭代器,并使用next从迭代器中获取第一项。

 

3. 定义模型

我们可以使用pytorch中预定义好的层来定义模型:

 nn是network的缩写; Sequential可以理解为一个list of layers,里面是按顺序的一个一个的层。Linear(2,1)接受了两个参数,2和1,第一个参数2表示输入神经元的个数,即输入的features的特征个数是2,第二个参数1表示输出的神经元的个数,即输出的labels有一个特征。 Sequential类将多个层串联在一起。 当给定输入数据时,Sequential实例将数据传入到第一层, 然后将第一层的输出作为第二层的输入,以此类推。

 

4. 模型参数初始化

深度学习框架通常有预定义的方法来初始化参数。

 在这里,我们通过net[0]访问神经网络的第一层,分别通过net[0].weight以及net[0].bias访问这一层的权重和偏置,再通过.data访问这些数据,对它们进行初始化,注意,使用框架初始化参数,normal_和fill_后面有个下划线。

 

5. 定义损失函数

我们在线性模型中使用的是平均平方损失函数,它在nn中的定义是nn.MSELoss():

 默认情况下,它返回所有样本的损失的平均值。

 

6. 定义优化算法

优化器的定义要对torch.optim.SGD()传入两个参数:网络的参数net.parameters()以及学习率lr:

 注意这个trainer是有网络的参数的信息的,所以在训练的时候,梯度清零可以直接用trainer.zero_grad(),更新参数可以直接用trainer.step()。

 

7. 训练

 注意l = loss(net(X),y),loss()函数是nn.MSELoss(),默认情况下它返回的是所有样本的损失的平均值,因此反向传播的时候是l.backward(),而不是l.sum().backward()。

 

 

本节完整代码:

import torch
import random
from d2l import torch as d2l
from torch.utils import data

true_w = torch.tensor([2,-3.4])
true_b = 4.2
features,labels = d2l.synthetic_data(true_w,true_b,1000)

def load_data(data_arrays,batch_size,is_train=True):
    dataset = data.TensorDataset(*data_arrays)
    return data.DataLoader(dataset,batch_size,is_train)

net = nn.Sequential(nn.Linear(2,1))
loss = nn.MSELoss()
trainer = torch.optim.SGD(net.parameters(),lr=0.03)
net[0].weight.data.normal_(0,0.01)
net[0].bias.data.fill_(0)

num_epochs = 3
batch_size = 10
data_iter = load_data((features,labels),batch_size)
for epoch in range(num_epochs):
    for X,y in data_iter:
        l = loss(net(X),y)
        trainer.zero_grad()
        l.backward()
        trainer.step()
    train_l = loss(net(features),labels)
    print(f'epoch {epoch+1}  loss {train_l:f}')

 

标签:简洁,nn,batch,002,参数,线性,net,data,size
From: https://www.cnblogs.com/pkuqcy/p/17408491.html

相关文章