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