论文解读:深度监督网络(Deeply-Supervised Nets)
所謂深監督(Deep Supervision),就是在深度神經網絡的某些中間隱藏層加了一個輔助的分類器作為一種網絡分支來對主干網絡進行監督的技巧,用來解決深度神經網絡訓練梯度消失和收斂速度過慢等問題。
深監督作為一個訓練trick在2014年就已經通過DSN(Deeply-Supervised Nets)提出來了。具體參見DSN論文。
DSN的一個缺點在于使用的網絡結構不夠深,且輔助的分類器為傳統的SVM模型。2015年的一篇Training Deeper Convolutional Networks with Deep Supervision的論文嘗試了在更深層結構的網絡中使用深監督技巧。
深監督的結構
通常而言,增加神經網絡的深度可以一定程度上提高網絡的表征能力,但隨著深度加深,會逐漸出現神經網絡難以訓練的情況,其中就包括像梯度消失和梯度爆炸等現象。為了更好的訓練深度網絡,我們可以嘗試給神經網絡的某些層添加一些輔助的分支分類器來解決這個問題。這種輔助的分支分類器能夠起到一種判斷隱藏層特征圖質量好壞的作用。
既然明確了要通過深監督來解決深度網絡難以訓練的問題,那么這個作為監督分支結構應該加在神經網絡的什么位置?論文作者根據一些經驗法則和實驗給出了結論。作者先是把深監督放在網絡最后一層,然后跑10-50次迭代,繪制出中間層的平均梯度值。最后作者將監督分支添加在平均梯度消失(原文中平均梯度小于10_(-7))的那一層。隨迭代次數變化的各卷積層的平均梯度值如下圖所示。可以看到,Conv1-4層在迭代次數增加時平均梯度值都要小于10_(-7)。
帶有深監督的一個8層深度卷積網絡結構如下圖所示。
帶有深監督的一個13層深度卷積網絡結構如下圖所示。
其中各個模塊含義如下:
損失函數
以W和Ws分別表示主干網絡和深監督分支的權重,則有:
輸出層softmax表示為:
深監督分支的損失函數為:
可以看到深監督分支的損失函數取決于W,而不是Ws,因為分支結構中倒數第二層的S8特征圖關聯到主干網絡的卷積權重W1-4。
所以,聯合損失函數可以表示為:
其中α_t可以表示為隨訓練epoch t衰減的一個值:
看到這個聯合損失函數是不是有種正則化的味道,實際也正是如此,輔助loss能夠起到一種類似正則化的效果。可以看到,Conv4在加深監督和不加深監督的平均梯度差異。如下圖所示:
Torch示例
下面以Torch為例實現一個帶深度監督的卷積模塊。先定義卷積塊:
import torch.nn as nn # 定義卷積塊 # 包含3x3卷積+BN+relu def conv3x3_bn_relu(in_planes, out_planes, stride=1):"3x3 convolution + BN + relu"return nn.Sequential(nn.Conv2d(in_planes, out_planes, kernel_size=3,stride=stride, padding=1, bias=False),BatchNorm2d(out_planes),nn.ReLU(inplace=True),)帶有深監督的卷積模塊如下:
class C1DeepSup(nn.Module):def __init__(self, num_class=150, fc_dim=2048, use_softmax=False):super(C1DeepSup, self).__init__()self.use_softmax = use_softmaxself.cbr = conv3x3_bn_relu(fc_dim, fc_dim // 4, 1)self.cbr_deepsup = conv3x3_bn_relu(fc_dim // 2, fc_dim // 4, 1)# 最后一層卷積self.conv_last = nn.Conv2d(fc_dim // 4, num_class, 1, 1, 0)self.conv_last_deepsup = nn.Conv2d(fc_dim // 4, num_class, 1, 1, 0)# 前向計算流程def forward(self, conv_out, segSize=None):conv5 = conv_out[-1]x = self.cbr(conv5)x = self.conv_last(x)if self.use_softmax: # is True during inferencex = nn.functional.interpolate(x, size=segSize, mode='bilinear', align_corners=False)x = nn.functional.softmax(x, dim=1)return x# 深監督模塊conv4 = conv_out[-2]_ = self.cbr_deepsup(conv4)_ = self.conv_last_deepsup(_)# 主干卷積網絡softmax輸出x = nn.functional.log_softmax(x, dim=1)# 深監督分支網絡softmax輸出_ = nn.functional.log_softmax(_, dim=1)return (x, _)總結
以上是生活随笔為你收集整理的论文解读:深度监督网络(Deeply-Supervised Nets)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: centos 7 打开端口
- 下一篇: C++编程学习(三)运算符