当前位置:   article > 正文

Dive into Deep Learning 3.4-3.7节学习_动手学深度学习 3.4.7推导

动手学深度学习 3.4.7推导

本文为学习《动手学习深度学习》的一些学习,内容来源于网址:

https://d2l.ai/ Dive into Deep Learning — Dive into Deep Learning
用于学习记录

3.3线性回归的简洁实现

在本节中,我们将介绍如何通过使用深度学习框架来简洁地实现 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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

读取数据集

我们可以[调用框架中现有的API来读取数据]。 我们将featureslabels作为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)
  • 1
  • 2
  • 3
  • 4
batch_size = 10
data_iter = load_array((features, labels), batch_size)
  • 1
  • 2

使用data_iter的方式与我们在 :numref:sec_linear_scratch中使用data_iter函数的方式相同。为了验证是否正常工作,让我们读取并打印第一个小批量样本。 与:numref:sec_linear_scratch不同,这里我们使用iter构造Python迭代器,并使用next从迭代器中获取第一项。

next(iter(data_iter))
  • 1
[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]])]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

定义模型

对于标准深度学习模型,我们可以[使用框架的预定义好的层]。这使我们只需关注使用哪些层来构造模型,而不必关注层的实现细节。 我们首先定义一个模型变量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))
  • 1
  • 2
  • 3
  • 4
  • 5

(初始化模型参数)

在使用net之前,我们需要初始化模型参数。 如在线性回归模型中的权重和偏置。 深度学习框架通常有预定义的方法来初始化参数。 在这里,我们指定每个权重参数应该从均值为0、标准差为0.01的正态分布中随机采样, 偏置参数将初始化为零。

正如我们在构造nn.Linear时指定输入和输出尺寸一样, 现在我们能直接访问参数以设定它们的初始值。 我们通过net[0]选择网络中的第一个图层, 然后使用weight.databias.data方法访问参数。 我们还可以使用替换方法normal_fill_来重写参数值。

net[0].weight.data.normal_(0, 0.01)
net[0].bias.data.fill_(0)
  • 1
  • 2

定义损失函数

[计算均方误差使用的是MSELoss类,也称为平方

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/黑客灵魂/article/detail/762201
推荐阅读