我們現在準備好通過線性回歸的全功能實現來工作。在本節中,我們將從頭開始實現整個方法,包括(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
. 我們還返回小批量中所有示例的平均損失值。
評論
查看更多