pytorch學習筆記(8):損失函數 學習率調整 一定堅持學完啊!!

損失函數:衡量模型輸出與其真是標籤的差異

損失函數:計算一個樣本的差異
代價函數:計算整個樣本的差異求平均
目標函數:代價函數+ 正則項

步驟:先設計一個損失函數
如:先定義loss:loss_function=nn.CrossEntropyLoss()
然後在訓練的時候調用loss_function:loss_function(outputs,labels)

1.nn.CrossEntropyLoss()

nn.LogSoftmax()與nn.NLLLOss()結合,進行交叉熵計算
nn.CrossEntropyLoss(
weight, 各類別的loss設置權值
size_average,
ignore_index,忽略某個類別
reduce,
reduction:計算模式:none逐個元素計算,sum:所有元素求和 mean:加權求和
)

交叉熵=信息熵+相對熵

2.nn.NLLLoss()

nn.NLLLoss(
weight, 各類別的loss設置權值
size_average,
ignore_index,忽略某個類別
reduce,
reduction:計算模式:none逐個元素計算,sum:所有元素求和 mean:加權求和
)

實現負對數似然函數中的負號功能

3.nn.BCELoss()

nn.BCELoss(
weight, 各類別的loss設置權值
size_average,
reduce,
reduction:計算模式:none逐個元素計算,sum:所有元素求和 mean:加權求和
)

二分類交叉熵

4.nn.BCEWithLogitsLoss()

結合sigmoid與二分類交叉熵

nn.BCEWithLogitsLoss(
weight, 各類別的loss設置權值
size_average,
reduce,
reduction:計算模式:none逐個元素計算,sum:所有元素求和 mean:加權求和
pos_weight:正樣本的權值
)

5.nn.L1Loss()

計算inputs與target之間的絕對值

nn.L1Loss(
size_average,
reduction:計算模式:none逐個元素計算,sum:所有元素求和 mean:加權求和
)

6.nn.MSELoss()

計算inputs與target之差的平方

nn.MSELoss(size_average,
reduction:計算模式:none逐個元素計算,sum:所有元素求和 mean:加權求和
)

7.nn.SmoothL1Loss()

平滑的L1Loss

.nn.SmoothL1Loss(
reduction:計算模式:none逐個元素計算,sum:所有元素求和 mean:加權求和
)

8.nn.PoissonNLLLoss()

泊松分佈的負對數似然損失函數

nn.PoissonNLLLoss(
log_input:輸入是否爲對數形式
full:計算所有loss
eps:修正項
reduction
)

9.nn.KLDivLoss()

計算KLD,KL散度,相對熵

nn.KLDivLoss(reduction)

10.nn.MarginRankingLoss(

計算兩個向量之間的相似度,用於排序任務

nn.MarginRankingLoss(
margin=0.0
reduction
)

11.nn.MultiLabelMarginLoss(reduction)

多標籤邊界損失函數

12.nn.SoftMarginLoss(reduction)

計算二分類的logistic

13.nn.MultiLabelSoftMarginLoss(weight,reduction)

SoftMarginLoss多標籤版本

14.nn.MultiMarginLoss(

nn.MultiMarginLoss(
p,
weight,
margin,
reduction
)

計算多分類的摺頁損失

15.nn.TripetMarginLoss(

nn.TripetMarginLoss(
p,
eps,
swap,
margin,
reduction
)

計算三元組損失

16.nn.HingeEmbeddingLoss()

計算兩個輸入的相似性,常用於非線性embedding和半監督

17.nn.CosineEmbeddingLoss()

採用餘弦相似度計算兩個輸入的相似性

18.nn.CTCLoss()

計算CTC損失,解決時序類數據分類

標題優化器:管理並更新模型中可學習參數的值,使得模型輸出更接近真實標籤

class Optimizer(object):
   def __init__(self,params,defaults):
           self.defaults=defaults  優化器超參數
           self.state=defaultdict(dict) 參數緩存
           self.param_groups=[]  管理的參數組
           self._step_count:記錄更新的次數 學習率調整的時候用
           ...
           param_groups=[{'params':params_groups}]
           
   def zero_grad(self):清空所管理參數的梯度
   def step():執行一步更新
   def add_param_group():添加參數組
   def state_dict():獲取優化器當前狀態信息字典
   def load_state_dict():加載狀態信息字典

momentum:動量 結合當前梯度與上一次更新信息,用於當前更新

optim.SGD(
params:管理的參數組
lr:初始學習率
momentum:動量係數,貝塔
weight_decay:L2正則化係數
nesterov:是否採用NAG
)

“”"

“”"

學習率的調整策略


class_LRScheduler(object):
   def __init__(self,optimizer,last_epoch=-1)
   optimizer:關聯的優化器
   last_epoch:記錄epoch數
   base_lrs:記錄初始學習率
   
   def step()更新一下個epoch的學習率
   def get_lr():虛函數,計算下一個epoch的學習率

1.StepLR:等間隔調整學習率

參數:step_size:調整間隔數 每個50個epoch調整
gamma:調整係數
調整方式:lr=lr*gamma

2.MultiStepLR:按給定間隔調整學習率

參數:milestones:設定調整時刻數list
gamma:調整係數
調整方式:lr=lr*gamma

3.ExponentialLR:按指數衰減調整學習率

參數:gamma:指數的低
調整方式:lr=lr*gamma**epoch

4.ConsineAnnealingLR:餘弦週期調整學習率

參數:T_max:下降週期
eta_min:學習率下限
調整方式:

5.ReduceLRonPlateau:監控指標,當指標不再變化則調整

主要參數:mode:min/max兩種模式
factor:調整係數
patience:接受幾次不變化
cooldown:停止監控一段時間
verbose:是否打印日誌
min_lr:學習率下限
eps:學習率衰減最小值

6.LambdaLR:自定義調整學習率

參數:lr_lambda:function or list

例如:lambda1=lambda epoch:0.1**(epoch//20)
lambda2=lambda epoch:0.95**epoch=

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章