在過去的十年中,深度學(xué)習(xí)見證了某種形式的寒武紀(jì)大爆發(fā)。技術(shù)、應(yīng)用和算法的絕對數(shù)量遠(yuǎn)遠(yuǎn)超過了前幾十年的進(jìn)步。這是由于多種因素的偶然組合,其中之一是許多開源深度學(xué)習(xí)框架提供的強大的免費工具。Theano (Bergstra等人,2010 年)、DistBelief (Dean等人,2012 年)和 Caffe (Jia等人,2014 年)可以說代表了被廣泛采用的第一代此類模型。與 SN2 (Simulateur Neuristique) 等早期(開創(chuàng)性)作品相比 (Bottou 和 Le Cun,1988),它提供了類似 Lisp 的編程體驗,現(xiàn)代框架提供了自動微分和 Python 的便利性。這些框架使我們能夠自動化和模塊化實現(xiàn)基于梯度的學(xué)習(xí)算法的重復(fù)性工作。
在3.4 節(jié)中,我們僅依靠 (i) 張量進(jìn)行數(shù)據(jù)存儲和線性代數(shù);(ii) 計算梯度的自動微分。在實踐中,由于數(shù)據(jù)迭代器、損失函數(shù)、優(yōu)化器和神經(jīng)網(wǎng)絡(luò)層非常普遍,現(xiàn)代圖書館也為我們實現(xiàn)了這些組件。在本節(jié)中,我們將向您展示如何 使用深度學(xué)習(xí)框架的高級 API 簡潔地實現(xiàn)3.4 節(jié)中的線性回歸模型。
3.5.1. 定義模型
當(dāng)我們在第 3.4 節(jié)中從頭開始實現(xiàn)線性回歸時 ,我們明確定義了我們的模型參數(shù)并編寫了計算代碼以使用基本線性代數(shù)運算生成輸出。你應(yīng)該知道如何做到這一點。但是一旦您的模型變得更加復(fù)雜,并且一旦您幾乎每天都必須這樣做,您就會很高興獲得幫助。這種情況類似于從頭開始編寫自己的博客。做一兩次是有益和有益的,但如果你花一個月重新發(fā)明輪子,你將成為一個糟糕的 Web 開發(fā)人員。
對于標(biāo)準(zhǔn)操作,我們可以使用框架的預(yù)定義層,這使我們能夠?qū)W⒂谟糜跇?gòu)建模型的層,而不用擔(dān)心它們的實現(xiàn)。回想一下圖 3.1.2中描述的單層網(wǎng)絡(luò)的架構(gòu)。該層稱為全連接層,因為它的每個輸入都通過矩陣向量乘法連接到它的每個輸出。
在 PyTorch 中,全連接層定義在Linear
和 LazyLinear
(自版本 1.8.0 起可用)類中。后者允許用戶僅指定輸出維度,而前者額外詢問有多少輸入進(jìn)入該層。指定輸入形狀很不方便,這可能需要大量的計算(例如在卷積層中)。因此,為簡單起見,我們將盡可能使用此類“惰性”層。
In Gluon, the fully connected layer is defined in the Dense
class. Since we only want to generate a single scalar output, we set that number to 1. It is worth noting that, for convenience, Gluon does not require us to specify the input shape for each layer. Hence we do not need to tell Gluon how many inputs go into this linear layer. When we first pass data through our model, e.g., when we execute net(X)
later, Gluon will automatically infer the number of inputs to each layer and thus instantiate the correct model. We will describe how this works in more detail later.
In Keras, the fully connected layer is defined in the Dense
class. Since we only want to generate a single scalar output, we set that number to 1. It is worth noting that, for convenience, Keras does not require us to specify the input shape for each layer. We do not need to tell Keras how many inputs go into this linear layer. When we first try to pass data through our model, e.g., when we execute net(X)
later, Keras will automatically infer the number of inputs to each layer. We will describe how this works in more detail later.
class LinearRegression(d2l.Module): #@save
"""The linear regression model implemented with high-level APIs."""
def __init__(self, lr):
super().__init__()
self.save_hyperparameters()
initializer = tf.initializers.RandomNormal(stddev=0.01)
self.net = tf.keras.layers.Dense(1, kernel_initializer=initializer)
在forward
方法中,我們只調(diào)用預(yù)定義層的內(nèi)置__call__
方法來計算輸出。
@d2l.add_to_class(LinearRegression) #@save
def forward(self, X):
return self.net(X)
3.5.2. 定義損失函數(shù)
該類MSELoss
計算均方誤差(沒有 1/2(3.1.5)中的因素)。默認(rèn)情況下,MSELoss
返回示例的平均損失。它比我們自己實現(xiàn)更快(也更容易使用)。
The loss
module defines many useful loss functions. For speed and convenience, we forgo implementing our own and choose the built-in loss.L2Loss
instead. Because the loss
that it returns is the squared error for each example, we use mean
to average the loss across over the minibatch.
The MeanSquaredError
class computes the mean squared error (without the 1/2 factor in (3.1.5)). By default, it returns the average loss over examples.
3.5.3. 定義優(yōu)化算法
Minibatch SGD 是用于優(yōu)化神經(jīng)網(wǎng)絡(luò)的標(biāo)準(zhǔn)工具,因此 PyTorch 支持它以及模塊中該算法的許多變體optim
。當(dāng)我們實例化一個SGD
實例時,我們指定要優(yōu)化的參數(shù),可通過 和我們的優(yōu)化算法所需的self.parameters()
學(xué)習(xí)率 ( ) 從我們的模型中獲得。self.lr
評論
查看更多