zoukankan      html  css  js  c++  java
  • 深度学习之稠密连接⽹络(DENSENET)

    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

  • 相关阅读:
    倒序三角形
    有时间了
    测试一个数是不是素数
    初学C++编写小程序
    N!的递归调用
    1+...+5的递归调用
    1!+....+5!
    菱形块
    23.git简单使用
    27.flask学习
  • 原文地址:https://www.cnblogs.com/somedayLi/p/12590024.html
Copyright © 2011-2022 走看看