def Bottlenecktransformer

时间: 2023-11-17 18:03:39 浏览: 33
BoTNet(Bottleneck Transformer Network)是一种基于Transformer的新骨干架构,它同时使用卷积和自注意力机制。在ResNet的最后3个bottleneck blocks中使用全局多头自注意力(Multi-Head Self-Attention, MHSA)替换3 × 3空间卷积。这种结构可以在保持高精度的同时,大大减少模型的计算量和参数数量。BoTNet已经在多个计算机视觉任务中取得了优异的表现,例如图像分类、目标检测和语义分割等。 ```python import torch import torch.nn as nn class MHSA(nn.Module): def __init__(self, dim, num_heads): super(MHSA, self).__init__() self.num_heads = num_heads self.head_dim = dim // num_heads self.scale = self.head_dim ** -0.5 self.query = nn.Linear(dim, dim, bias=False) self.key = nn.Linear(dim, dim, bias=False) self.value = nn.Linear(dim, dim, bias=False) self.out = nn.Linear(dim, dim) def forward(self, x): b, n, _, h = *x.shape, self.num_heads qkv = [l(x).reshape(b, n, h, self.head_dim).transpose(1, 2) for l, x in zip((self.query, self.key, self.value), (x, x, x))] dots = qkv[0] @ qkv[1].transpose(-2, -1) * self.scale attn = dots.softmax(dim=-1) out = attn @ qkv[2] out = out.transpose(1, 2).reshape(b, n, -1) return self.out(out) class Bottleneck(nn.Module): def __init__(self, dim, num_heads, expansion_factor=4): super(Bottleneck, self).__init__() self.mhsa = MHSA(dim, num_heads) self.norm1 = nn.LayerNorm(dim) self.mlp = nn.Sequential( nn.Linear(dim, expansion_factor * dim), nn.GELU(), nn.Linear(expansion_factor * dim, dim), ) self.norm2 = nn.LayerNorm(dim) def forward(self, x): x = x + self.mhsa(self.norm1(x)) x = x + self.mlp(self.norm2(x)) return x class BoTNet(nn.Module): def __init__(self, layers, channels, num_classes, num_heads=4, expansion_factor=4): super(BoTNet, self).__init__() self.stem = nn.Sequential( nn.Conv2d(3, channels[0], kernel_size=3, stride=2, padding=1, bias=False), nn.BatchNorm2d(channels[0]), nn.ReLU(inplace=True), nn.Conv2d(channels[0], channels[0], kernel_size=3, stride=1, padding=1, bias=False), nn.BatchNorm2d(channels[0]), nn.ReLU(inplace=True), nn.Conv2d(channels[0], channels[0], kernel_size=3, stride=1, padding=1, bias=False), nn.BatchNorm2d(channels[0]), nn.ReLU(inplace=True), nn.MaxPool2d(kernel_size=3, stride=2, padding=1), ) self.layer1 = self._make_layer(dim=channels[0], num_heads=num_heads, expansion_factor=expansion_factor, num_blocks=layers[0]) self.layer2 = self._make_layer(dim=channels[1], num_heads=num_heads, expansion_factor=expansion_factor, num_blocks=layers[1], stride=2) self.layer3 = self._make_layer(dim=channels[2], num_heads=num_heads, expansion_factor=expansion_factor, num_blocks=layers[2], stride=2) self.layer4 = self._make_layer(dim=channels[3], num_heads=num_heads, expansion_factor=expansion_factor, num_blocks=layers[3], stride=2) self.avgpool = nn.AdaptiveAvgPool2d((1, 1)) self.fc = nn.Linear(channels[3], num_classes) def _make_layer(self, dim, num_heads, expansion_factor, num_blocks, stride=1): layers = [Bottleneck(dim, num_heads, expansion_factor=expansion_factor)] for _ in range(num_blocks - 1): layers.append(Bottleneck(dim, num_heads, expansion_factor=expansion_factor)) return nn.Sequential(*layers) def forward(self, x): x = self.stem(x) x = self.layer1(x) x = self.layer2(x) x = self.layer3(x) x = self.layer4(x) x = self.avgpool(x) x = x.flatten(1) x = self.fc(x) return x ```

相关推荐

最新推荐

recommend-type

python中def是做什么的

在本篇文章里小编给大家分享的是关于python中def的作用以及相关用法,有需要的朋友们可以学习下。
recommend-type

python自定义函数def的应用详解

def 自定义函数的必要函数:def 使用方法: def 函数名(参数1,参数2,参数…): 函数体(语句块) return [返回值] 注意事项 函数名的命名规则:和标识符的基本规则是一样的,基本上由小写字母和数字下划线...
recommend-type

MingW VC 之.a .lib .dll .def 关系

MinGW 之 (lib,dll,def,obj,exe) vs (a,dll,def,o,exe) 玩转攻略手记 一份粗糙的研究记录,有待补完和整理。 MinGW: c -> o gcc -c a.c c -> exe gcc a.c libs.o -o a.exe (从主程序a.c,附加libs,生成a.exe) o -...
recommend-type

电影票房.csv

电影票房
recommend-type

ASP.NET技术在网站开发设计中的研究与开发(论文+源代码+开题报告)【ASP】.zip

ASP.NET技术在网站开发设计中的研究与开发(论文+源代码+开题报告)【ASP】
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

MATLAB结构体与对象编程:构建面向对象的应用程序,提升代码可维护性和可扩展性

![MATLAB结构体与对象编程:构建面向对象的应用程序,提升代码可维护性和可扩展性](https://picx.zhimg.com/80/v2-8132d9acfebe1c248865e24dc5445720_1440w.webp?source=1def8aca) # 1. MATLAB结构体基础** MATLAB结构体是一种数据结构,用于存储和组织相关数据。它由一系列域组成,每个域都有一个名称和一个值。结构体提供了对数据的灵活访问和管理,使其成为组织和处理复杂数据集的理想选择。 MATLAB中创建结构体非常简单,使用struct函数即可。例如: ```matlab myStruct
recommend-type

详细描述一下STM32F103C8T6怎么与DHT11连接

STM32F103C8T6可以通过单总线协议与DHT11连接。连接步骤如下: 1. 将DHT11的VCC引脚连接到STM32F103C8T6的5V电源引脚; 2. 将DHT11的GND引脚连接到STM32F103C8T6的GND引脚; 3. 将DHT11的DATA引脚连接到STM32F103C8T6的GPIO引脚,可以选择任一GPIO引脚,需要在程序中配置; 4. 在程序中初始化GPIO引脚,将其设为输出模式,并输出高电平,持续至少18ms,以激活DHT11; 5. 将GPIO引脚设为输入模式,等待DHT11响应,DHT11会先输出一个80us的低电平,然后输出一个80us的高电平,
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。