赞
踩
本文为学习《动手学习深度学习》的一些学习,内容来源于网址:
https://d2l.ai/ Dive into Deep Learning — Dive into Deep Learning
用于学习记录
在本节中,我们将介绍如何通过使用深度学习框架来简洁地实现 3.2节中的线性回归模型。
同上一节一样,首先我们生成数据集
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
features, labels = d2l.synthetic_data(true_w, true_b, 1000)
我们可以[调用框架中现有的API来读取数据]。 我们将features
和labels
作为API的参数传递,并通过数据迭代器指定batch_size
。 此外,布尔值is_train
表示是否希望数据迭代器对象在每个迭代周期内打乱数据。
def load_array(data_arrays, batch_size, is_train=True): #@save
"""构造一个PyTorch数据迭代器"""
dataset = data.TensorDataset(*data_arrays)
return data.DataLoader(dataset, batch_size, shuffle=is_train)
batch_size = 10
data_iter = load_array((features, labels), batch_size)
使用data_iter
的方式与我们在 :numref:sec_linear_scratch
中使用data_iter
函数的方式相同。为了验证是否正常工作,让我们读取并打印第一个小批量样本。 与:numref:sec_linear_scratch
不同,这里我们使用iter
构造Python迭代器,并使用next
从迭代器中获取第一项。
next(iter(data_iter))
[tensor([[ 6.5540e-01, 4.8845e-01], [ 2.9239e+00, -1.0434e+00], [-1.1138e+00, -2.8268e-01], [-6.1571e-01, -1.8541e+00], [ 4.1536e-01, -1.1004e-01], [-3.0715e-01, -5.9745e-01], [-3.0655e-01, 1.5793e-03], [-1.3754e+00, -1.3812e+00], [ 1.4831e+00, -1.3262e+00], [ 4.0001e-01, -9.0868e-01]]), tensor([[ 3.8507], [13.6003], [ 2.9386], [ 9.2701], [ 5.4006], [ 5.6166], [ 3.5723], [ 6.1388], [11.6530], [ 8.0939]])]
对于标准深度学习模型,我们可以[使用框架的预定义好的层]。这使我们只需关注使用哪些层来构造模型,而不必关注层的实现细节。 我们首先定义一个模型变量net
,它是一个Sequential
类的实例。 Sequential
类将多个层串联在一起。 当给定输入数据时,Sequential
实例将数据传入到第一层, 然后将第一层的输出作为第二层的输入,以此类推。 在下面的例子中,我们的模型只包含一个层,因此实际上不需要Sequential
。 但是由于以后几乎所有的模型都是多层的,在这里使用Sequential
会让你熟悉“标准的流水线”。
回顾 :numref:fig_single_neuron
中的单层网络架构, 这一单层被称为全连接层(fully-connected layer), 因为它的每一个输入都通过矩阵-向量乘法得到它的每个输出。
在PyTorch中,全连接层在Linear
类中定义。 值得注意的是,我们将两个参数传递到nn.Linear
中。 第一个指定输入特征形状,即2,第二个指定输出特征形状,输出特征形状为单个标量,因此为1。
nn是神经网络的缩写
from torch import nn
net = nn.Sequential(nn.Linear(2, 1))
(初始化模型参数)
在使用net
之前,我们需要初始化模型参数。 如在线性回归模型中的权重和偏置。 深度学习框架通常有预定义的方法来初始化参数。 在这里,我们指定每个权重参数应该从均值为0、标准差为0.01的正态分布中随机采样, 偏置参数将初始化为零。
正如我们在构造nn.Linear
时指定输入和输出尺寸一样, 现在我们能直接访问参数以设定它们的初始值。 我们通过net[0]
选择网络中的第一个图层, 然后使用weight.data
和bias.data
方法访问参数。 我们还可以使用替换方法normal_
和fill_
来重写参数值。
net[0].weight.data.normal_(0, 0.01)
net[0].bias.data.fill_(0)
[计算均方误差使用的是MSELoss
类,也称为平方
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。