我们现在准备好通过线性回归的全功能实现来工作。在本节中,我们将从头开始实现整个方法,包括(i)模型;(ii) 损失函数;(iii) 小批量随机梯度下降优化器;(iv) 将所有这些部分拼接在一起的训练功能。最后,我们将运行3.3 节中的合成数据生成器 并将我们的模型应用于生成的数据集。虽然现代深度学习框架几乎可以自动执行所有这些工作,但从头开始实施是确保您真正了解自己在做什么的唯一方法。此外,当需要自定义模型、定义我们自己的层或损失函数时,了解引擎盖下的工作原理将很方便。在本节中,我们将仅依赖张量和自动微分。稍后,我们将介绍一个更简洁的实现,利用深度学习框架的花哨功能,同时保留以下结构。
%matplotlib inline
import tensorflow as tf
from d2l import tensorflow as d2l
3.4.1. 定义模型
在我们开始通过小批量 SGD 优化模型参数之前,我们首先需要有一些参数。在下文中,我们通过从均值为 0 且标准差为 0.01 的正态分布中抽取随机数来初始化权重。幻数 0.01 在实践中通常效果很好,但您可以通过参数指定不同的值sigma
。此外,我们将偏差设置为 0。注意,对于面向对象的设计,我们将代码添加到__init__
子类的方法中(在3.2.2 节d2l.Module
中介绍 )。
class LinearRegressionScratch(d2l.Module): #@save
"""The linear regression model implemented from scratch."""
def __init__(self, num_inputs, lr, sigma=0.01):
super().__init__()
self.save_hyperparameters()
self.w = torch.normal(0, sigma, (num_inputs, 1), requires_grad=True)
self.b = torch.zeros(1, requires_grad=True)
class LinearRegressionScratch(d2l.Module): #@save
"""The linear regression model implemented from scratch."""
def __init__(self, num_inputs, lr, sigma=0.01):
super().__init__()
self.save_hyperparameters()
self.w = np.random.normal(0, sigma, (num_inputs, 1))
self.b = np.zeros(1)
self.w.attach_grad()
self.b.attach_grad()
class LinearRegressionScratch(d2l.Module): #@save
"""The linear regression model implemented from scratch."""
num_inputs: int
lr: float
sigma: float = 0.01
def setup(self):
self.w = self.param('w', nn.initializers.normal(self.sigma),
(self.num_inputs, 1))
self.b = self.param('b', nn.initializers.zeros, (1))
class LinearRegressionScratch(d2l.Module): #@save
"""The linear regression model implemented from scratch."""
def __init__(self, num_inputs, lr, sigma=0.01):
super().__init__()
self.save_hyperparameters()
w = tf.random.normal((num_inputs, 1), mean=0, stddev=0.01)
b = tf.zeros(1)
self.w = tf.Variable(w, trainable=True)
self.b = tf.Variable(b, trainable=True)
接下来,我们必须定义我们的模型,将其输入和参数与其输出相关联。在(3.1.4)中使用相同的符号,对于我们的线性模型,我们简单地采用输入特征的矩阵向量乘积X和模型权重w,并加上偏移量b每个例子。Xw是一个向量并且b是一个标量。由于广播机制(参见 第 2.1.4 节),当我们添加一个向量和一个标量时,标量将添加到向量的每个分量。生成的 方法 通过(在第 3.2.1 节中介绍 )forward
在类中注册。LinearRegressionScratch
add_to_class
3.4.2. 定义损失函数
由于更新我们的模型需要采用损失函数的梯度,因此我们应该首先定义损失函数。这里我们使用(3.1.5)中的平方损失函数。在实现中,我们需要将真实值转换y
为预测值的形状 y_hat
。以下方法返回的结果也将具有与y_hat
. 我们还返回小批量中所有示例的平均损失值。
评论
查看更多