CCNet代码详解

实际上CCnet,基本相当于在卷积提取特征之后(用的resnet),加上了一个自己的head,也就是所谓的十字交叉注意力机制/module。

ResNet由bottleNeck和basicBlock组成。

BasicBlock、bottleneck的结构:
在这里插入图片描述

  • 左图:一个积木块(56×56个特征图),如图3所示,用于ResNet-34。右图:ResNet-50/101/152的“瓶颈”构建块。
  • 左边的就叫做BasicBlock,右边就叫bottleneck
    我们可以看到方框(就是一个卷积层layer)中的数字33,64,表示什么意思呢?就是卷积的大小是33的,然后维度是64,就是特征层有64个(大小是33),叠加在一起就是一个方块的样子,那在BasicBlock中,两个层的大小是相等,所以加在一起是长方体。
  • 这样的话,是否就能够理解,bottleneck这个残差块的名字的由来了呢?
    没错,上面是11,64大小的块,中间是33,64大小的块,下面是1*1,256大小的块,叠加在一起,是不是一个瓶子的形状,上面细,中间粗,下面细。
import torch.nn as nn
#CNN模型:ResNet是一种残差网络,可以把它理解为一个子网络,这个子网络经过堆叠可以构成一个很深的网络。
#ResNet由bottleNeck和basicBlock组成
#增加ResNet,为了保证下一层的网络状态仍然是最优状态
#残差:观测值与估计值之间的差。
#BasicBlock类用于构建网络中的子网络结构(后称block),子网络中包含两个卷积层和残差处理
class BasicBlock(nn.Module):
    #expansion是残差结构中输出维度是输入维度的多少倍,BasicBlock没有升维
    expansion = 1
    #__init __()中主要是定义一些层的参数。
    #in_channels表示输入数据体的深度,out_channels表示输出数据体的深度,stride表示滑动步长,#stride = 1意味着对图片不进行采样
    def __init__(self, in_channels, out_channels, stride=1, avg_size=5):
        super().__init__()
        self.avg_size = avg_size
       #nn.Sequential 括号内的内容就是我们搭建的神经网络模型的具体结构
        self.function = nn.Sequential(
            #nn.Conv2d()是卷积核模块,kernel_size表示卷积核的大小,stride表示滑动步长,padding表示0边界填充个数,bias表示偏置
            nn.Conv2d(in_channels, out_channels, kernel_size=3, stride=stride, padding=1, bias=False),
            #在卷积神经网络的卷积层之后总会添加BatchNorm2d进行数据的归一化处理,这使得数据在进行Relu之前不会因为数据过大而导致网络性能的不稳定
            #batchnorm2d()中的参数为实际的输入的特征数也就是通道数
            nn.BatchNorm2d(out_channels),
            #inplace为True,将会改变输入的数据 ,否则不会改变原输入,只会产生新的输出
            nn.ReLU(inplace=True),
            nn.Conv2d(out_channels, out_channels * BasicBlock.expansion, kernel_size=3, padding=1, bias=False),
            nn.BatchNorm2d(out_channels * BasicBlock.expansion),
            nn.ReLU(inplace=True)
        )
        #self.scaler是为了数据标准化
        self.scaler = nn.Sequential(
            # nn.Linear定义模型的线性层,不同的层之间的线性变换
            # nn.Linear(A,B) 完成从A层到B层的线性变换
            # 参数有三个,分别是输入特征数、输出特征数和是否使用偏置,默认为 True ,即使用偏置
            nn.Linear(out_channels * self.avg_size ** 2, out_channels // 16),
            nn.ReLU(inplace=True),
            # nn.BatchNorm1d() 的作用是对数据进行标准化
            # 参数里面只加上待处理的数据的通道数(特征数量)
            nn.BatchNorm1d(out_channels // 16),
            nn.Linear(out_channels // 16, out_channels * 2),
            # 非线性激活函数类
            nn.Sigmoid()
        )

        self.avg = nn.AdaptiveAvgPool2d(self.avg_size)

        self.adjust = nn.Sequential()

        if stride != 1 
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值