深度学习之稠密连接?络(DENSENET)

2021-03-31 04:25

阅读:576

标签:ima   区别   mamicode   pen   turn   chapter   mod   uda   相加   

DenseNet与残差网络(ResNet)有区别也类似。区别如下:

在跨层连接上:ResNet(左)使?相加;DenseNet(右)使?连结。

技术图片

DenseNet将模块 A 直接跟模块 B 后?的所有层连接在了?起。这也是它被称
为“稠密连接”的原因。

DenseNet的主要构建模块是稠密块(dense block)和过渡层(transition layer)。前者定义了输?和输出是如何连结的,后者则?来控制通道数,使之不过?。

一、稠密块

DenseNet使?了ResNet改良版的“批量归?化、激活和卷积”结构。

import time
import torch
from torch import nn, optim
import torch.nn.functional as F
import sys
sys.path.append("..")
import d2lzh_pytorch as d2l
device = torch.device(‘cuda‘ if torch.cuda.is_available() 			else‘cpu‘)
def conv_block(in_channels, out_channels):
    blk = nn.Sequential(nn.BatchNorm2d(in_channels),
                        nn.ReLU(),
                        nn.Conv2d(in_channels, out_channels,
                                  kernel_size=3, padding=1))
 return blk

稠密块由多个 conv_block 组成,每块使?相同的输出通道数。但在前向计算时,我们将每块的输?和输出在通道维上连结。

class DenseBlock(nn.Module):
    def __init__(self, num_convs, in_channels, ut_channels):
        super(DenseBlock, self).__init__()
        net = []
        for i in range(num_convs):
            in_c = in_channels + i * out_channels
            net.append(conv_block(in_c, out_channels))
            self.net = nn.ModuleList(net)
            self.out_channels = in_channels + num_convs *
            					out_channels
    # 计算输出通道数
    def forward(self, X):
        for blk in self.net:
            Y = blk(X)
            X = torch.cat((X, Y), dim=1) # 在通道维上将输?和输出连结
		 return X

二、过渡层

由于每个稠密块都会带来通道数的增加,使?过多则会带来过于复杂的模型。过渡层?来控制模型复杂度。它通过 卷积层来减?通道数,并使?步幅为2的平均池化层减半?和宽,从?进?步降低模型复杂度。

def transition_block(in_channels, out_channels):
    blk = nn.Sequential(nn.BatchNorm2d(in_channels), 
                        nn.ReLU(),
                        nn.Conv2d(in_channels, out_channels,
                                  kernel_size=1),
                        nn.AvgPool2d(kernel_size=2,
                                     stride=2))
    return blk

三、构建模型

DenseNet?先使?同ResNet?样的单卷积层和最?池化层。

net = nn.Sequential(
    nn.Conv2d(1, 64, kernel_size=7, stride=2, padding=3),
    nn.BatchNorm2d(64),
    nn.ReLU(),
    nn.MaxPool2d(kernel_size=3, stride=2, padding=1))

参考链接:https://zh.d2l.ai/chapter_convolutional-neural-networks/densenet.html

深度学习之稠密连接?络(DENSENET)

标签:ima   区别   mamicode   pen   turn   chapter   mod   uda   相加   

原文地址:https://www.cnblogs.com/somedayLi/p/12590024.html


评论


亲,登录后才可以留言!