每日Attention学习11——Lightweight Dilated Bottleneck

模块出处

[TITS 23] [link] [code] Lightweight Real-Time Semantic Segmentation Network With Efficient Transformer and CNN


模块名称

Lightweight Dilated Bottleneck (LDB)


模块作用

改进的编码器块


模块结构

在这里插入图片描述


模块代码
import torch
import torch.nn as nn
import torch.nn.functional as Fclass Conv(nn.Module):def __init__(self, nIn, nOut, kSize, stride, padding, dilation=(1, 1), groups=1, bn_acti=False, bias=False):super().__init__()self.bn_acti = bn_actiself.conv = nn.Conv2d(nIn, nOut, kernel_size=kSize,stride=stride, padding=padding,dilation=dilation, groups=groups, bias=bias)if self.bn_acti:self.bn_prelu = BNPReLU(nOut)def forward(self, input):output = self.conv(input)if self.bn_acti:output = self.bn_prelu(output)return outputclass BNPReLU(nn.Module):def __init__(self, nIn):super().__init__()self.bn = nn.BatchNorm2d(nIn, eps=1e-3)self.acti = nn.PReLU(nIn)def forward(self, input):output = self.bn(input)output = self.acti(output)return outputclass ShuffleBlock(nn.Module):def __init__(self, groups):super(ShuffleBlock, self).__init__()self.groups = groupsdef forward(self, x):'''Channel shuffle: [N,C,H,W] -> [N,g,C/g,H,W] -> [N,C/g,g,H,w] -> [N,C,H,W]'''N, C, H, W = x.size()g = self.groups#return x.view(N, g, int(C / g), H, W).permute(0, 2, 1, 3, 4).contiguous().view(N, C, H, W)class eca_layer(nn.Module):"""Constructs a ECA module.Args:channel: Number of channels of the input feature mapk_size: Adaptive selection of kernel size"""def __init__(self, channel, k_size=3):super(eca_layer, self).__init__()self.avg_pool = nn.AdaptiveAvgPool2d(1)self.conv = nn.Conv1d(1, 1, kernel_size=k_size, padding=(k_size - 1) // 2, bias=False)self.sigmoid = nn.Sigmoid()def forward(self, x):b, c, h, w = x.size()# feature descriptor on the global spatial informationy = self.avg_pool(x)# Two different branches of ECA moduley = self.conv(y.squeeze(-1).transpose(-1, -2)).transpose(-1, -2).unsqueeze(-1)# Multi-scale information fusiony = self.sigmoid(y)return x * y.expand_as(x)class LDB(nn.Module):def __init__(self, nIn, d=1, kSize=3, dkSize=3):super().__init__()self.bn_relu_1 = BNPReLU(nIn)self.conv1x1_in = Conv(nIn, nIn // 2, 1, 1, padding=0, bn_acti=False)self.conv3x1 = Conv(nIn // 2, nIn // 2, (kSize, 1), 1, padding=(1, 0), bn_acti=True)self.conv1x3 = Conv(nIn // 2, nIn // 2, (1, kSize), 1, padding=(0, 1), bn_acti=True)self.dconv3x1 = Conv(nIn // 2, nIn // 2, (dkSize, 1), 1, padding=(1, 0), groups=nIn // 2, bn_acti=True)self.dconv1x3 = Conv(nIn // 2, nIn // 2, (1, dkSize), 1, padding=(0, 1), groups=nIn // 2, bn_acti=True)self.ca11 = eca_layer(nIn // 2)self.ddconv3x1 = Conv(nIn // 2, nIn // 2, (dkSize, 1), 1, padding=(1 * d, 0), dilation=(d, 1), groups=nIn // 2, bn_acti=True)self.ddconv1x3 = Conv(nIn // 2, nIn // 2, (1, dkSize), 1, padding=(0, 1 * d), dilation=(1, d), groups=nIn // 2, bn_acti=True)self.ca22 = eca_layer(nIn // 2)self.bn_relu_2 = BNPReLU(nIn // 2)self.conv1x1 = Conv(nIn // 2, nIn, 1, 1, padding=0, bn_acti=False)self.shuffle = ShuffleBlock(nIn // 2)def forward(self, input):output = self.bn_relu_1(input)output = self.conv1x1_in(output)output = self.conv3x1(output)output = self.conv1x3(output)br1 = self.dconv3x1(output)br1 = self.dconv1x3(br1)br1 = self.ca11(br1)br2 = self.ddconv3x1(output)br2 = self.ddconv1x3(br2)br2 = self.ca22(br2)output = br1 + br2 + outputoutput = self.bn_relu_2(output)output = self.conv1x1(output)output = self.shuffle(output + input)return outputif __name__ == '__main__':x = torch.randn([3, 256, 32, 32])ldb = LDB(nIn=256)out = ldb(x)print(out.shape)  # 3, 256, 32, 32

原文表述

LDB的结构整体上借鉴了ResNet的思想,将模块设计为残差模块,以在网络层数尽可能少的情况下收集更多的特征信息。具体来说,在bottleneck处,通过1×1卷积将输入特征的通道数减半,减少通道数之后,参数量和计算量大大减少,虽然这样会损失一部分准确率,但此时多堆叠两个模块比弥补损失更为有利。同时,由于使用了1×1卷积,必须加深网络深度才能获得更大的感受野,因此在1×1卷积之后,增加了3×1和1×3的分解卷积,以拓展感受野,从而捕捉更大范围的上下文信息。而且分解卷积也是基于考虑参数数量和计算量。同样,在接下来的双分支结构中,两个分支也都使用了分解卷积,其中一个负责局部、短距离的特征信息,另一个则使用了空洞卷积,负责在不同空洞率下从更大的感受野中提取特征信息。紧接着这两个分支的是通道注意力机制,其灵感来自ECANet,旨在在通道维度上构建注意力矩阵,以增强特征表达,抑制噪声干扰,因为对于CNN来说,大部分特征信息都包含在通道中。然后,将两个低维分支和中间特征融合,输入到下面的1×1逐点卷积中,以将特征图的通道数恢复为与输入特征图的通道数相同。最后,采用channel shuffle的策略,避免depth-wise convolution带来的信息独立、通道间无相关性的弊端,促进不同通道间语义信息的交换。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/45121.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

qt 添加一个图片控件

在Qt中,要添加一个图片控件,你通常会使用QLabel或者QGraphicsView来显示图片。下面是使用QLabel来显示图片的一种方法: 使用 QLabel 显示图片 在Qt Designer中添加QLabel 打开你的Qt Designer。从工具箱中找到QLabel控件,并将其拖…

C#如何进行深度学习对行人进行识别?

C#通常不是用于深度学习的主要语言,但是通过一些库和框架,你可以轻松地在C#中实现深度学习。以下是使用C#进行深度学习的一些更详细的步骤: 选择合适的库: ML.NET:这是微软推出的一个机器学习库,它很容易集成到.NET应用程序中。ML.NET支持广泛的机器学习任务,包括深度学…

使用DeepWalk 和Word2Vec实现单词Embedding

0、准备“边”数据集Wiki_edgelist import pandas as pddf pd.read_csv(./data/wiki/Wiki_edgelist.txt, sep , headerNone, names["source", "target"]) df.head() 1、读入 起点-终点 边数据,构建图 # 1、读入 起点-终点 边数据&#xff0c…

GIS就业相关问题快问快答

目录 前言1.现在处于经济下行期,GIS就业岗位是否减少了?2.我未来的打算是进体制内研发岗,这方面需要掌握哪些技能呢?3.GIS前端需要掌握哪些知识?4.GIS后端需要掌握哪些知识?5.不论是前端还是后端&#xff0…

编程语言都是哪些人开发出来的?为什么都是国外较小国家的人

编程语言都是哪些人开发出来的? 编程语言的开发者通常是来自计算机科学、软件工程、数学、物理学等领域的专家、学者和工程师。这些开发者具备深厚的编程技能、算法知识、系统设计能力以及创新思维,他们致力于创造出能够解决特定问题或满足特定需求的编…

Docker入门(清晰认识)

为什么学习Docker? 再学完linux后,我们需要远程对Linux虚拟机下载一些软件,如果在Linux里直接用命令下载软件会十分麻烦,所以我们需要通过使用Docker将软件直接下载到Docker中,这样更方便下载和卸载等操作。 一张图弄…

javaScript的面试重点--预解析

目录 一.前言 二.预解析案例 一.前言 关于预解析,我们通过今天学习就能够知道解析器运行JS分为哪两步;能够说出变量提升的步骤和运行过程;能够说出函数提升的步骤和运行过程。 二.预解析案例 预解析,简而言之,也就是…

7.13实训日志

上午 学习网络安全的过程中,我们深入了解了网络的不同层面和技术,从表层网络到深网再到暗网,以及涉及的产业分类和技术工具。这些知识不仅帮助我们理解网络的复杂性,还揭示了如何应对和防范各种网络威胁。 首先,我们…

简易秒表的实现

目录 描述 输入描述: 输出描述: 参考代码 描述 请编写一个模块,实现简易秒表的功能:具有两个输出,当输出端口second从1-60循环计数,每当second计数到60,输出端口minute加一,一直…

当在多线程环境中使用 C++进行编程时,怎样确保线程安全以及如何处理线程之间的同步和通信?

在C中确保线程安全性和处理线程之间的同步和通信有多种方法。下面是一些常用的技术和技巧: 互斥锁:使用互斥锁可以确保只有一个线程可以访问共享资源。在访问共享资源之前获取锁,在完成后释放锁。这可以防止多个线程同时访问同一份数据&#…

007-端口隔离

端口隔离配置 端口隔离简介 为了实现报文之间的二层隔离,可以将不同的端口加入不同的VLAN,但会浪费有限的VLAN资源。采用端口隔离特性,可以实现同一VLAN内端口之间的隔离。 设备支持以下方式进行端口隔离: 基于隔离组的端口隔…

中介子方程五十七

XXFXXaXnXaXXαXLXyXXWXuXeXKXXiXyXΣXXΣXXVXuXhXXWXηXXiXhXXpXiXXpXXbXXiXOXWXyXkXXeXpXXαXXpXeXXkXyXWXOXiXXbXXpXXiXpXXhXiXXηXWXXhXuXVXXΣXXΣXyXiXXKXeXuXWXXyXLXαXXaXnXaXXFXXaXnXaXXαXLXyXXWXuXeXKXXiXyXΣXXΣXXVXuXhXXWXηXXiXhXXpXiXXpXXbXXiXOXWXyXkXXeXpXXα…

理解JavaScript中的对象传递与赋值操作

在JavaScript中,对象传递和赋值操作是两个非常重要的概念。它们在日常开发中扮演着关键角色,但也常常会让人感到困惑。本文将通过两个简单的例子,更好地理解它们的区别和实际应用。 示例代码1:修改对象属性 我们先来看第一段示例…

【数据结构】顺序表的应用

目录 一.引言 二.顺序表概念 三.顺序表的实现 1.定义顺序表 2.顺序表初始化 ​编辑 3.检查空间,如果满了,进行增容 4.顺序表尾插 5.顺序表尾删 6.顺序表头插 7.顺序表头删 ​编辑 8.顺序表查找 9.顺序表在pos位置插入x 10.顺序表删…

展开说说:Android页面绘制流程源码解析

说到Android系统View的绘制流程,大家一定知道是分为测量(Measure)、布局(Layout)和绘制(Draw)三个阶段,这篇文章主要聊一聊在这三个步骤之前的源码执行流程,页面启动后是…

C语言丢失精度 如何实现高精度计算

(1)int 类型举例 int :占4个字节,也就是32位,及最大值是2^32-11024*1024*1024*4-14294967295 以上说法错误,因为Int是有符号类型整数,所以最高位是符号位,及int的最大值应该是2^31…

【Java】链表的头插法和尾插法

头插法 头插法就是在已有的节点的前面插入新节点 如何实现 (1)先定义一个节点类ListNode,里面有value值和地址 public class ListNode {int value;ListNode next;public ListNode(int value){this.value value;}Overridepublic String t…

开发指南046-机构树控件

为了简化编程&#xff0c;平台封装了很多前端组件。机构树就是常用的组件之一。 基本用法&#xff1a; import QlmOrgTree from /qlmcomponents/tree/QlmOrgTree <QlmOrgTree></QlmOrgTree> 功能&#xff1a; 根据权限和控制参数显示机构树。机构树数据来源于核…

让我们一起来看看这些强大的中国汽车品牌如何勇攀巅峰!

咱们中国的汽车品牌&#xff0c;就是这么牛&#xff01;你知道吗&#xff1f;他们已经悄悄崛起&#xff0c;一步步向着更广阔的海外市场进军了。尽管这个过程可能有点坎坷&#xff0c;但是“勇敢”始终是他们前行的动力&#xff0c;推动着他们不断向前&#xff0c;打造属于我们…

AGI 之 【Hugging Face】 的【文本摘要】的 [评估PEGASUS ] / [ 微调PEGASUS ] / [生成对话摘要] 的简单整理

AGI 之 【Hugging Face】 的【文本摘要】的 [评估PEGASUS ] / [ 微调PEGASUS ] / [生成对话摘要] 的简单整理 目录 AGI 之 【Hugging Face】 的【文本摘要】的 [评估PEGASUS ] / [ 微调PEGASUS ] / [生成对话摘要] 的简单整理 一、简单介绍 二、文本摘要 三、在CNN/Daily…