detnet代码解析

DetNet结构+代码详细解析

由于最近的项目需要用到对模型进行改进,因此记录一些新的backbone网络,也方便自己日后查阅。

首先是detnet的基本结构描述,这是一个在resnet的基础上改进的网络,resnet的网络结构如下:
resnet基本结构

与resnet相同的前4个stage

detnet-59是在resnet50的基础上进行改进,前四个stage都是一样的,也就是1+3×3+3×4+3×6=40层是一模一样的。而在代码中,是以Bottleneck类的形式出现:

class Bottleneck(nn.Module):
    expansion = 4    #表示一个Bottleneck结构后通道数的扩张倍数

    def __init__(self, inplanes, planes, stride=1, downsample=None):
        super(Bottleneck, self).__init__()
        self.conv1 = nn.Conv2d(inplanes, planes, kernel_size=1, bias=False)
        self.bn1 = nn.BatchNorm2d(planes)
        self.conv2 = nn.Conv2d(planes, planes, kernel_size=3, stride=stride,
                               padding=1, bias=False)
        self.bn2 = nn.BatchNorm2d(planes)
        self.conv3 = nn.Conv2d(planes, planes * 4, kernel_size=1, bias=False)
        self.bn3 = nn.BatchNorm2d(planes * 4)
        self.relu = nn.ReLU(inplace=True)
        self.downsample = downsample
        self.stride = stride

    def forward(self, x):
        residual = x

        out = self.conv1(x)
        out = self.bn1(out)
        out = self.relu(out)

        out = self.conv2(out)
        out = self.bn2(out)
        out = self.relu(out)

        out = self.conv3(out)
        out = self.bn3(out)

        if self.downsample is not None:      #使残差部分和卷积前向出来之后通道一致
            residual = self.downsample(x)        

        out += residual                      #参差部分相加
        out = self.relu(out)

        return out

可以看出3层卷积时通道数是这样变化的:inplanes–planes–planes–4*planes。
而在创建网络时是这样用的:

    def _make_layer(self, block, planes, blocks, stride=1):  #这里的block就是上文的Bottleneck类
        downsample = None
        if stride != 1 or self.inplanes != planes * block.expansion:
            downsample = nn.Sequential(
                nn.Conv2d(self.inplanes, planes * block.expansion,    #如果输入的通道参数不对,做下采样调整
                          kernel_size=1, stride=stride, bias=False),          
                nn.BatchNorm2d(planes * block.expansion),
            )

        layers = []
        layers.append(block(self.inplanes, planes, stride, downsample))
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值