如何入門Pytorch之三 如何優化神經網路

2022-06-13 11:30:11 字數 4491 閱讀 6009

在上一節中,我們介紹了如何使用pytorch來搭建乙個經典的分類神經網路。

在本節中,我們將介紹從資料集到模型各個部分的調整,從而可以有乙個完整的解決思路。

1、資料集部分

1.1 資料集劃分

當然,還有一些需要考慮的問題:資料表徵,時間敏感性和資料冗餘。在資料表徵中,隨機打亂(shuffle)是乙個不錯的選擇;時間敏感性主要是針對回歸問題象****,不同的月份對回歸結果有乙個不同的貢獻;資料冗餘指的是,在資料集中,存在著一些相同的資料會對訓練和測試結果產生影響,所以,需要事先過濾掉。

1.2資料預處理

資料向量化:資料來源形式各異,需要提前把它轉換成框架可以識別的形式,pytorch統一使用向量(vector)來表示資料。

正則化:資料的範圍大小不一,如果直接使用,訓練的收斂會很慢,甚至會出現異常。所以,需要統一資料的範圍大小,也就是去除綱量,使用【0,1】區間來統一度量。 

缺失資料的處理:如果沒有對缺失資料進行處理,訓練過程中會直接導致資料的權重分配異常,進而直接影響訓練效果。

特徵工程:對資料集的特徵進行有效提取,是保證模型正常訓練的前提。

1.3過擬合與欠擬合

過擬合:訓練效果好而驗證效果不好。

欠擬合:訓練效果不好。

欠擬合的處理相對容易些,針對欠擬合,我們一般採用加大訓練週期,降低訓練損失,提高訓練精度。

過擬合策略:

1、獲取更多資料

2、減小網路規模

原始模型:

class

architecture1(nn.module):

def__init__

(self, input_size, hidden_size, num_classes):

super(architecture1, self).

__init__

()self.fc1 =nn.linear(input_size, hidden_size)

self.relu =nn.relu()

self.fc2 =nn.linear(hidden_size, num_classes)

self.relu =nn.relu()

self.fc3 =nn.linear(hidden_size, num_classes)

defforward(self, x):

out =self.fc1(x)

out =self.relu(out)

out =self.fc2(out)

out =self.relu(out)

out =self.fc3(out)

return out

減小規模後的模型:

class

architecture2(nn.module):

def__init__

(self, input_size, hidden_size, num_classes):

super(architecture2, self).

__init__

()self.fc1 =nn.linear(input_size, hidden_size)

self.relu =nn.relu()

self.fc2 =nn.linear(hidden_size, num_classes)

defforward(self, x):

out =self.fc1(x)

out =self.relu(out)

out =self.fc2(out)

return out

3、使用權重正則化

正則化分為1階正則化和2階正則化

1階正則化是將權重協相關係數的相差絕對值加入權重。

model = architecture1(10,20,2)

optimizer = torch.optim.adam(model.parameters(), lr=1e-4, weight_decay=1e-5)

4、使用dropout

在隱藏層中去除某些節點,以達到防止過擬合的問題。

dropout的比率為0.2:

dropout的比率為0.5

nn.dropout(x, training=true)
1.4問題定義與資料集獲取

首先需要明確兩個事情:問題的類別與資料的輸入,確定是分類問題還是回歸問題。

不同類別的問題有著不同的處理方法,對資料集的獲取也是必須面對的一大難題。

1.5模型評估

對於分類問題,一般採用精度,roc,auc等方法來進行評估;

而對於排名問題,一般採用map;

2、模型部分

2.1 搭建完基礎模型後,為了使該模型能夠正常工作,我們需要做以下三部分工作:

1、選擇網路輸出的最後一層

不同的任務,輸出最後一層也不盡相同。一般的回歸問題只要輸出乙個標量就可以;向量回歸問題則需要輸出相同層的向量;對於bbox問題,則需要輸出四個值;對於二分類,我們需要使用sigmoid,對於多分類則使用softmax。

2、選擇損失函式

對於分類問題,一般採用交叉熵損失;而對於回歸問題,則採用均方差。

3、優化器

problem type                   activation function            loss function  

binary classification sigmoid activation nn.crossentropyloss()

multi-class

classification softmax activation nn.crossentropyloss()

multi-label classification sigmoid activation nn.crossentropyloss()

regression none mse

vector regression none mse

2.2 提高模型規模

對於乙個已搭建好的模型,如何提高模型的推理能力。可以從這三方面來提高:

1、增加更多的層

2、加入更多的權重係數

3、提高訓練週期

2.3 加入泛化策略

1、加入dropout

2、使用不同的架構,不同的引數,不同的網路層數,權重。

3、使用l1或l2正則化

4、嘗試不同的學習率

5、增加更多的資料或特徵

2.4學習率的設定

學習率對於模型來說,是乙個非常重要的超引數。它的設定很多時候直接決定著模型訓練效果的好壞。所以,如何設定該引數就變得非常重要。有大量的研究就是針對於該引數進行的。

在pytorch中,有一系列的方法:

1、steplr:

scheduler = steplr(optimizer, step_size=30, gamma=0.1)   #step_size:多少個週期後學習率發生改變  gamma:學習率如何改變

for epoch in range(100):

scheduler.step()

train(...)

validate(...)

2、multisteplr

scheduler = multisteplr(optimizer, milestones=[30,80], gamma=0.1)
#milestones:多少個週期後學習率發生改變 gamma:學習率如何改變
for epoch in range(100): scheduler.step() train(...) validate(...)
3、exponentiallr

4、reducelronplateau

optimizer = torch.optim.sgd(model.parameters(), lr=0.1,

momentum=0.9)

scheduler = reducelronplateau(optimizer, '

min'

)for epoch in range(10):

train(...)

val_loss =validate(...)

#note that step should be called after validate()

scheduler.step(val_loss)

如何入門pytorch之二:如何搭建實用神經網路

如何入門pytorch之四:搭建神經網路訓練mnist

PyTorch入門(三)PyTorch常用操作

def bilinear kernel in channels,out channels,kernel size return a bilinear kernel tensor tensor in channels,out channels,kernel size,kernel size 返回雙線性...

如何安裝pytorch

離線安裝 用conda安裝會比較方便,下面直接用conda安裝 conda config add channels conda config add channels conda config add channels 或者,直接改.condarc檔案 注意 沒有自己電腦gpu,就不要安裝cuda了...

如何安裝 PyTorch

現在使用 pytorch 框架進行深度學習的人越來越多了,但是 torch 的安裝 gpu 版本 和普通第三方包的安裝過程不太一樣,因為涉及到電腦的顯示卡驅動版本,下面來看看安裝 pytorch 的正確姿勢。開啟 nvidia 控制面板,點選工具欄幫助 系統資訊,在彈出的對話方塊中有如下資訊 可以看...