損失函數:衡量模型輸出與其真是標籤的差異
損失函數:計算一個樣本的差異
代價函數:計算整個樣本的差異求平均
目標函數:代價函數+ 正則項
步驟:先設計一個損失函數
如:先定義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=