萊蕪公司做網(wǎng)站外鏈相冊
一、導(dǎo)言
激活函數(shù)在目標(biāo)檢測中的作用至關(guān)重要,它們主要服務(wù)于以下幾個關(guān)鍵目的:
-
引入非線性:神經(jīng)網(wǎng)絡(luò)的基本構(gòu)建塊(如卷積層、全連接層等)本質(zhì)上是線性變換,而激活函數(shù)通過引入非線性,使得網(wǎng)絡(luò)能夠?qū)W習(xí)和表達(dá)更復(fù)雜、更豐富的數(shù)據(jù)特征。這對于目標(biāo)檢測任務(wù)尤為重要,因為目標(biāo)可能出現(xiàn)在圖像中的任何位置、大小和姿態(tài),且彼此之間可能有重疊或遮擋,非線性表達(dá)能力可以幫助模型更好地理解和區(qū)分這些復(fù)雜的場景。
-
控制梯度流:激活函數(shù)的形狀影響著反向傳播過程中的梯度傳遞,這對于權(quán)重更新和學(xué)習(xí)過程至關(guān)重要。例如,ReLU及其變體(如Leaky ReLU、PReLU、FReLU等)通過在負(fù)值區(qū)域保持非零斜率,解決了傳統(tǒng)ReLU可能導(dǎo)致的“神經(jīng)元死亡”問題,從而促進了深層網(wǎng)絡(luò)中的梯度流動。
-
增強模型表達(dá)能力:特定的激活函數(shù)能夠提升模型在特定任務(wù)上的表現(xiàn)。例如,FReLU(Funnel Activation Function)通過在激活階段整合空間信息,提高了模型的空間理解能力,這對于目標(biāo)檢測這種需要精確定位的任務(wù)非常有利。
-
影響計算效率:不同的激活函數(shù)具有不同的計算復(fù)雜度。在實時目標(biāo)檢測系統(tǒng)如YOLO系列中,選擇計算成本低且效果好的激活函數(shù)(如ReLU)對于保證模型的運行速度和資源效率是必要的。
-
輸出范圍調(diào)整:某些激活函數(shù)(如Sigmoid和Softmax)能夠?qū)⑤敵鱿拗圃谔囟ǚ秶鷥?nèi),這在輸出層特別有用,比如將網(wǎng)絡(luò)輸出轉(zhuǎn)化為概率值,便于進行目標(biāo)類別預(yù)測。
綜上所述,激活函數(shù)不僅決定了神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)能力,還在很大程度上影響了目標(biāo)檢測模型的精度、訓(xùn)練效率以及最終的檢測性能。因此,在設(shè)計目標(biāo)檢測網(wǎng)絡(luò)時,精心選擇和設(shè)計激活函數(shù)是一個重要環(huán)節(jié)。
二、YOLO訓(xùn)練中常見且有效的激活函數(shù)
-
SiLU (Sigmoid Linear Unit): 也稱為Swish,是一種自適應(yīng)激活函數(shù)。SiLU嘗試結(jié)合了線性變換和sigmoid函數(shù)的優(yōu)點,能夠提升模型的非線性表達(dá)能力,同時緩解梯度消失問題。
-
ReLU (Rectified Linear Unit): 是最常用的激活函數(shù)之一,當(dāng)輸入為正時,輸出等于輸入;為負(fù)時,輸出為0。ReLU解決了sigmoid和tanh函數(shù)的梯度飽和問題,加速了神經(jīng)網(wǎng)絡(luò)的訓(xùn)練,但在負(fù)值區(qū)域梯度為0,可能導(dǎo)致“死亡ReLU”現(xiàn)象。
-
Leaky ReLU: 為了解決ReLU在負(fù)值區(qū)域梯度消失的問題而提出,即使負(fù)輸入時函數(shù)也有非零斜率,幫助梯度流動。
-
FReLU (Fractional ReLU): 是ReLU的一個變種,它引入了一個可學(xué)習(xí)的參數(shù)來調(diào)整負(fù)輸入部分的斜率,提供了比Leaky ReLU更靈活的調(diào)整能力。
-
PReLU (Parametric ReLU): 類似于Leaky ReLU,適用于不同層可能需要不同負(fù)斜率的情況。
-
Hardswish: 是MobileNetV3中引入的一種激活函數(shù),試圖模仿Swish但計算成本更低。它在移動端設(shè)備上表現(xiàn)高效且性能良好。
-
Mish: 由D. Misra提出,Mish結(jié)合了自我門控的性質(zhì)和ReLU的簡單性,被發(fā)現(xiàn)能在多種任務(wù)上提高模型性能。
-
ELU (Exponential Linear Unit): 目的是減少ReLU的偏差移位問題并加速學(xué)習(xí)過程。
-
CELU (Continuously Differentiable Exponential Linear Unit): 是ELU的一個連續(xù)可微分版本,旨在保持ELU的優(yōu)點同時確保所有點的導(dǎo)數(shù)存在,適合需要嚴(yán)格平滑性的應(yīng)用。
-
GELU (Gaussian Error Linear Unit): 形式較為復(fù)雜,與高斯分布的累積分布函數(shù)有關(guān)。GELU在Transformer等模型中表現(xiàn)優(yōu)秀,因為它能更好地匹配神經(jīng)網(wǎng)絡(luò)中權(quán)重初始化的分布。
-
SELU (Scaled Exponential Linear Unit): 設(shè)計用于自歸一化神經(jīng)網(wǎng)絡(luò),SELU旨在確保網(wǎng)絡(luò)的輸出具有零均值和單位方差,從而簡化訓(xùn)練過程中的歸一化需求。
需要注意的是,YOLOv7、YOLOv5項目采用的默認(rèn)激活函數(shù)為SiLU,而YOLOv7-tiny項目采用的激活函數(shù)為LeakyReLU,ResNet系列采用的激活函數(shù)則為ReLU,選擇何種激活函數(shù)為自己的Baseline需要先查閱相關(guān)論文再下判斷,以此為改進的對照方可得出結(jié)果。
同時,YOLOv5/v7的激活函數(shù)一般在models/activations.py下
三、YOLOv7-tiny改進工作
了解二后,在YOLOv7項目文件下的models文件夾下的common.py,采用ctrl+F搜索如下代碼。
self.act = nn.SiLU() if act is True else (act if isinstance(act, nn.Module) else nn.Identity())
將其替換為二的激活函數(shù)即可。
四、YOLOv7改進工作
了解二后,在YOLOv7項目文件下的models文件夾下的common.py,采用ctrl+F搜索如下代碼。
self.act = nn.SiLU() if act is True else (act if isinstance(act, nn.Module) else nn.Identity())
將其替換為二的激活函數(shù)即可。
五、YOLOv5改進工作
了解二后,在YOLOv5項目文件下的models文件夾下的common.py,采用ctrl+F搜索如下代碼。
self.act = nn.SiLU() if act is True else (act if isinstance(act, nn.Module) else nn.Identity())
將其替換為二的激活函數(shù)即可。
更多文章產(chǎn)出中,主打簡潔和準(zhǔn)確,歡迎關(guān)注我,共同探討!