深度学习100问:什么是深监督(Deep Supervision)?

点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达93581318d65b87270b90cac2a379f484.png

     所谓深监督(Deep Supervision),就是在深度神经网络的某些中间隐藏层加了一个辅助的分类器作为一种网络分支来对主干网络进行监督的技巧,用来解决深度神经网络训练梯度消失和收敛速度过慢等问题。

     深监督作为一个训练trick在2014年就已经通过DSN(Deeply-Supervised Nets)提出来了。具体参见DSN论文。

4df11a8a2a43be14b9f3920071f21e8f.png

     DSN的一个缺点在于使用的网络结构不够深,且辅助的分类器为传统的SVM模型。2015年的一篇Training Deeper Convolutional Networks with Deep Supervision的论文尝试了在更深层结构的网络中使用深监督技巧。

4f6461b72e75a6c793df7a9903d4ab74.png

深监督的结构

     通常而言,增加神经网络的深度可以一定程度上提高网络的表征能力,但随着深度加深,会逐渐出现神经网络难以训练的情况,其中就包括像梯度消失和梯度爆炸等现象。为了更好的训练深度网络,我们可以尝试给神经网络的某些层添加一些辅助的分支分类器来解决这个问题。这种辅助的分支分类器能够起到一种判断隐藏层特征图质量好坏的作用。

     既然明确了要通过深监督来解决深度网络难以训练的问题,那么这个作为监督分支结构应该加在神经网络的什么位置?论文作者根据一些经验法则和实验给出了结论。作者先是把深监督放在网络最后一层,然后跑10-50次迭代,绘制出中间层的平均梯度值。最后作者将监督分支添加在平均梯度消失(原文中平均梯度小于10_(-7))的那一层。随迭代次数变化的各卷积层的平均梯度值如下图所示。可以看到,Conv1-4层在迭代次数增加时平均梯度值都要小于10_(-7)。

52d9802c3ebd369385eeb22df47d4f2b.png

     带有深监督的一个8层深度卷积网络结构如下图所示。

391edf9c58a18caf29a6db94dbdac78a.png

     带有深监督的一个13层深度卷积网络结构如下图所示。

4b52bcaacfdcf34c740ca189dea41fbb.png

     其中各个模块含义如下:

a02488fa8a8b5c8e5ef7fa7cf1789bdd.png

     可以看到,图中在第四个卷积块之后添加了一个监督分类器作为分支。Conv4输出的特征图除了随着主网络进入Conv5之外,也作为输入进入了分支分类器。如图所示,该分支分类器包括一个卷积块、两个带有Dropout和ReLu的全连接块和一个纯全连接块。

损失函数

     以W和Ws分别表示主干网络和深监督分支的权重,则有:

804fed9d26602b99e2a1268e083e4c8a.png

     输出层softmax表示为:

29b2a46b5be6990abe71097d2f13031f.png

     主干网络的损失函数为:

8834c08f8c691ce33242302701c29a9d.png

     深监督分支的softmax输出表示为:

8c1ead57fa6df0d0858f55eaacc17856.png

     深监督分支的损失函数为:

50aeb2c0ba46784f519f379b66ba20fa.png

     可以看到深监督分支的损失函数取决于W,而不是Ws,因为分支结构中倒数第二层的S8特征图关联到主干网络的卷积权重W1-4。

     所以,联合损失函数可以表示为:

8d2169787daa47ee9cd5a68ea3dfa005.png

     其中α_t可以表示为随训练epoch t衰减的一个值:

fb0bd4f09b28ba615b32e840332cb274.png

     看到这个联合损失函数是不是有种正则化的味道,实际也正是如此,辅助loss能够起到一种类似正则化的效果。可以看到,Conv4在加深监督和不加深监督的平均梯度差异。如下图所示:

1daa67deea8f1f1151ca220367a58172.png

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_softmax
        self.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 inference
            x = 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, _)

     在U-Net等经典语义分割网络中,使用深监督技巧是一个通用做法。以上就是本文内容。

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲

在「小白学视觉」公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲

在「小白学视觉」公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

982536d2f6f2660317c821136e9f7f6a.png

2cff9b62ec7dcd7c23ecd8ee1c549cec.png

  • 7
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值