日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

PyTorch的损失函数和优化器

發布時間:2025/4/5 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PyTorch的损失函数和优化器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • PyTorch的損失函數和優化器
    • 損失函數
    • 優化器
    • 總結

PyTorch的損失函數和優化器

損失函數

一般來說,PyTorch的損失函數有兩種形式:函數形式和模塊形式。前者調用的是torch.nn.functional庫中的函數,通過傳入神經網絡預測值和目標值來計算損失函數。后者是torch.nn庫里的模塊,通過建立一個模塊的實例,然后通過調用模塊方法來計算最終的損失函數。

對于回歸問題,一般情況下使用的是torch.nn.MSELoss模塊,即平方損失函數,在實例中傳入神經網絡的預測值和目標值,能夠計算得到最終的損失函數。

mse = nn.MSELoss() # 初始化平方損失函數模塊t1 = torch.randn(5, requires_grad=True) t2 = torch.randn(5, requires_grad=True)print(mse(t1, t2)) # 計算t1和t2之間的平方損失函數

得到的結果為:

tensor(2.2568, grad_fn=<MseLossBackward>)

對于分類問題,如果是二分類用到的交叉熵損失函數,可以使用torch.nn.BCELoss模塊實現。同樣,在初始化這個模塊的時候可以用默認參數,輸出所有損失函數的平均。該模塊一般接受的是Sigmoid函數的輸出。注意這個損失函數接受兩個張量,第一個張量是正分類標簽的概率值,第二個張量是以0為負分類標簽、1為正分類標簽的目標數據值,這兩個值必須是浮點類型。

bce = nn.BCELoss()t1 = torch.randn(5, requires_grad=True) t1s = torch.sigmoid(t1) # 對張量求Sigmoid函數,轉換為(0, 1)之間的概率 t2 = torch.randint(0, 2, (5, )).float() # 隨機生成(0, 1)之間的整數序列并轉換為浮點數print(bce(t1s, t2)) # 計算交叉熵

得到的結果為:

tensor(0.8664, grad_fn=<BinaryCrossEntropyBackward>)

另外在二分類問題中也經常用到對數交叉熵損失函數torch.nn.BECWithLogitsLoss,這個函數和前面的交叉熵損失函數的區別在于可以直接省略Sigmoid函數部分的計算。這是因為該函數會自動在損失函數內部的實現部分添加Sigmoid激活函數,在訓練時可以增加計算的數值穩定性。

bce_logits = nn.BCEWithLogitsLoss() # 使用交叉熵對數損失函數print(bce_logits(t1, t2)) # 計算交叉熵,結果應和前面的一致

得到的結果為:

tensor(0.8664, grad_fn=<BinaryCrossEntropyWithLogitsBackward>)

在多分類的情況下,也可以使用兩個模塊。第一個模塊是torch.nn.NLLLoss,即負對數似然函數,這個損失函數的運算過程是根據預測值和目標值計算這兩個值按照元素值一一對應的乘積,然后對乘積求和,并去負值。注意這里的預測值是經過Softmax的計算和對數計算的,目標值使用one-hot編碼。 因此這個損失函數在使用之前必須先計算Softmax函數去對數的結果。可以用PyTorch中的torch.nn.functional.log_softmax實現。

N = 10 # 定義分類數目t1 = torch.randn(5, N, requires_grad=True) # 隨機產生預測張量 t1s = torch.nn.functional.log_softmax(t1, -1) # 計算預測張量的LogSoftmax t2 = torch.randint(0, N, (5, )) # 隨機產生目標張量nll = nn.NLLLoss() # 定義損失函數print(nll(t1s, t2)) # 計算損失函數

得到的結果為:

tensor(2.4824, grad_fn=<NllLossBackward>)

第二個模塊是torch.nn.CrossEntroyLoss,用于構建目標損失函數,這個損失函數可以避免LogSoftmax的計算,在損失函數里整合Softmax輸出概率,以及對概率取對數輸出損失函數。

ce = nn.CrossEntropyLoss()print(ce(t1, t2))

此時得到的結果與NLL損失函數的結果一致。

優化器

有了損失函數,就可以對模型進行優化。

接下來會演示如何擬合一個線性模型。

首先構建一個有13個參數的線性回歸模型,然后構建損失函數的計算模塊criterion,并將其設置為MSELoss模塊的實例。有了損失函數后就可以構建一個隨機梯度下降算法的優化器。關于torch.optim.SGD的第一個參數是線性回歸模型的生成器,第二個參數是學習率。接下來構建訓練的輸入特征和預測目標,傳入的參數是載入的波士頓房價的特征和預測目標的Numpy數組。

為了實現前向和反向傳播計算,在構建輸入特征的時候需要設置requires_grad=True,這樣就能在計算過程中構建計算圖。

接下來就是優化過程,需要先獲取當前參數下模型的預測結果,并且使用這個結果計算出損失函數,然后清空梯度,損失函數調用反向傳播算法,計算得到內個參數對應的梯度,最后執行一步優化的算法。

import torch import torch.nn as nn from sklearn.datasets import load_bostonclass LinearModel(nn.Module):def __init__(self, ndim):super(LinearModel, self).__init__()self.ndim = ndimself.weight = nn.Parameter(torch.randn(ndim, 1))self.bias = nn.Parameter(torch.randn(1))def forward(self, x):return x.mm(self.weight) + self.biasboston = load_boston()lm = LinearModel(13) criterion = nn.MSELoss() optim = torch.optim.SGD(lm.parameters(), lr = 1e-6) # 定義優化器 data = torch.tensor(boston["data"], requires_grad=True, dtype=torch.float32) # 該數據為雙精度類型,需要轉換為單精度 target = torch.tensor(boston["target"], dtype=torch.float32)for step in range(10000):predict = lm(data) # 輸出模型預測結果loss = criterion(predict, target) # 輸出損失函數if step and step % 1000 == 0:print("Loss:{:.3f}".format(loss.item()))optim.zero_grad() # 清零梯度loss.backward() # 反向傳播optim.step()

上述代碼使用波士頓地區房價數據,通過安裝scikit-learn庫。該數據有13個特征,一共506條數據。為簡便起見,直接使用全局數據來進行訓練。另外由于數據量比較小,每一次模型的優化都會使用全局數據而不是用Mini-batch。

以下是得到的結果,可以看到損失函數在每一步優化的時候逐漸下降了。

Loss:337.852 Loss:257.781 Loss:228.257 Loss:210.646 Loss:197.336 Loss:186.189 Loss:176.497 Loss:167.958 Loss:160.397

在如上的代碼中,可以看到隨機梯度下降算法算法優化器torch.optim.SGD構建了一個方法,能夠對傳入參數生成器中的每個參數進行優化。在優化之前,首先要執行兩個步驟,第一個是調用zero_grad方法清空所有的參數前一次反向傳播的梯度,第二個是調用損失函數的backward方法來計算所有參數的當前反向傳播的梯度。

PyTorch的優化器對于不同的參數可以使用不同的學習率。默認的學習率是10-2,默認動量為0.9,但對于model.classifier子模塊來說,默認的學習率是10-3。通過使用字典的列表分別指定學習率,可以達到對不同的參數使用不同的學習率的目的。如下所示:

optim.SGD([{'params': model.base.parameters()},{'params': model.classifier.parameters(), 'lr': 1e-3} ], lr=1e-2, momentum=0.9)

在優化器以外,torch.optim包還提供了學習衰減的相關類,這些類都在torch.optim的子包torch.optim.lr_scheduler中。

scheduler = StepLR(optimizer, step_size=30, gamma=0.1)for epoch in range(100):train(...)validate(...)scheduler.step()

如上所示,在使用的時候需要傳入具體的優化器,以及隔多少步進行學習率衰減以及衰減的系數。在上述代碼中就是每次經過30個迭代期,學習率會變成原來的0.1倍,每次經過一個迭代期都會調用梯度衰減類的step方法,學習率衰減類會記錄當前的迭代期,并根據當前的迭代期決定是否發生學習率的衰減。

總結

PyTorch定義了一系列的損失函數,包括回歸的損失函數和分類的損失函數以及其他的一些損失函數分別用于不同的深度學習任務。同時在優化器方法提供了大量成熟的實現,包括SGD、RMSProp等等。通過優化器的類,可以很容易地根據模型的參數構建對應優化器的實例,然后通過反向傳播計算出模型參數對應的梯度,最后調用優化器相關的優化方法對模型的參數進行優化,整個過程非常方便和直觀。同時為了能夠在模型訓練過程中提供學習率的動態調節方法,PyTorch也提供了相關的類來調整學習率。

總結

以上是生活随笔為你收集整理的PyTorch的损失函数和优化器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。