SKNet介绍

2024-08-27 18:48
文章标签 介绍 sknet

本文主要是介绍SKNet介绍,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

https://blog.csdn.net/ITOMG/article/details/89673593(先看这个,理解sknet)

https://zhuanlan.zhihu.com/p/59690223(再看这个,原作者大局上的理解)

https://github.com/implus/PytorchInsight(pytorch实现)

对照下面的图像及代码基本就能理解他是怎么实现的

class Bottleneck(nn.Module):expansion = 4def __init__(self, inplanes, planes, stride=1, downsample=None):super(Bottleneck, self).__init__()self.conv1 = conv1x1(inplanes, planes)self.bn1 = nn.BatchNorm2d(planes)self.conv2 = conv3x3(planes, planes, stride)self.bn2 = nn.BatchNorm2d(planes)self.conv2g = conv3x3(planes, planes, stride, groups = 32)self.bn2g   = nn.BatchNorm2d(planes)self.conv3 = conv1x1(planes, planes * self.expansion)self.bn3 = nn.BatchNorm2d(planes * self.expansion)self.relu = nn.ReLU(inplace=True)self.downsample = downsampleself.stride = strideself.avg_pool = nn.AdaptiveAvgPool2d(1)self.conv_fc1 = nn.Conv2d(planes, planes//16, 1, bias=False)self.bn_fc1   = nn.BatchNorm2d(planes//16)self.conv_fc2 = nn.Conv2d(planes//16, 2 * planes, 1, bias=False)self.D = planesdef forward(self, x):identity = xout = self.conv1(x)out = self.bn1(out)out = self.relu(out)d1 = self.conv2(out)d1 = self.bn2(d1)d1 = self.relu(d1)d2 = self.conv2g(out)d2 = self.bn2g(d2)d2 = self.relu(d2)d  = self.avg_pool(d1) + self.avg_pool(d2)d = F.relu(self.bn_fc1(self.conv_fc1(d)))d = self.conv_fc2(d)d = torch.unsqueeze(d, 1).view(-1, 2, self.D, 1, 1)d = F.softmax(d, 1)d1 = d1 * d[:, 0, :, :, :].squeeze(1)d2 = d2 * d[:, 1, :, :, :].squeeze(1)d  = d1 + d2out = self.conv3(d)out = self.bn3(out)if self.downsample is not None:identity = self.downsample(x)out += identityout = self.relu(out)return out

pytorch源码的实现好像与原文不太一样

第一个不同:

原文一个卷积是3*3,另一个尺度的卷积是3*3,dilation为2。

但是作者在实现的时候使用了groups,没有使用dilation,具体原因不明,具体如conv2g。

self.conv2 = conv3x3(planes, planes, stride)
self.bn2 = nn.BatchNorm2d(planes)
self.conv2g = conv3x3(planes, planes, stride, groups = 32)
self.bn2g   = nn.BatchNorm2d(planes)

第二个不同:

论文中是压缩提取模块,用的全连接的方式,但代码中他使用了2个1*1的卷积。

        self.conv_fc1 = nn.Conv2d(planes, planes//16, 1, bias=False)self.bn_fc1   = nn.BatchNorm2d(planes//16)self.conv_fc2 = nn.Conv2d(planes//16, 2 * planes, 1, bias=False)

 

这篇关于SKNet介绍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1112482

相关文章

Redis的安全机制详细介绍及配置方法

《Redis的安全机制详细介绍及配置方法》本文介绍Redis安全机制的配置方法,包括绑定IP地址、设置密码、保护模式、禁用危险命令、防火墙限制、TLS加密、客户端连接限制、最大内存使用和日志审计等,通... 目录1. 绑定 IP 地址2. 设置密码3. 保护模式4. 禁用危险命令5. 通过防火墙限制访问6.

5 种使用Python自动化处理PDF的实用方法介绍

《5种使用Python自动化处理PDF的实用方法介绍》自动化处理PDF文件已成为减少重复工作、提升工作效率的重要手段,本文将介绍五种实用方法,从内置工具到专业库,帮助你在Python中实现PDF任务... 目录使用内置库(os、subprocess)调用外部工具使用 PyPDF2 进行基本 PDF 操作使用

Java中HashMap的用法详细介绍

《Java中HashMap的用法详细介绍》JavaHashMap是一种高效的数据结构,用于存储键值对,它是基于哈希表实现的,提供快速的插入、删除和查找操作,:本文主要介绍Java中HashMap... 目录一.HashMap1.基本概念2.底层数据结构:3.HashCode和equals方法为什么重写Has

Springboot项目构建时各种依赖详细介绍与依赖关系说明详解

《Springboot项目构建时各种依赖详细介绍与依赖关系说明详解》SpringBoot通过spring-boot-dependencies统一依赖版本管理,spring-boot-starter-w... 目录一、spring-boot-dependencies1.简介2. 内容概览3.核心内容结构4.

setsid 命令工作原理和使用案例介绍

《setsid命令工作原理和使用案例介绍》setsid命令在Linux中创建独立会话,使进程脱离终端运行,适用于守护进程和后台任务,通过重定向输出和确保权限,可有效管理长时间运行的进程,本文给大家介... 目录setsid 命令介绍和使用案例基本介绍基本语法主要特点命令参数使用案例1. 在后台运行命令2.

MySQL常用字符串函数示例和场景介绍

《MySQL常用字符串函数示例和场景介绍》MySQL提供了丰富的字符串函数帮助我们高效地对字符串进行处理、转换和分析,本文我将全面且深入地介绍MySQL常用的字符串函数,并结合具体示例和场景,帮你熟练... 目录一、字符串函数概述1.1 字符串函数的作用1.2 字符串函数分类二、字符串长度与统计函数2.1

zookeeper端口说明及介绍

《zookeeper端口说明及介绍》:本文主要介绍zookeeper端口说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、zookeeper有三个端口(可以修改)aVNMqvZ二、3个端口的作用三、部署时注意总China编程结一、zookeeper有三个端口(可以

Python中win32包的安装及常见用途介绍

《Python中win32包的安装及常见用途介绍》在Windows环境下,PythonWin32模块通常随Python安装包一起安装,:本文主要介绍Python中win32包的安装及常见用途的相关... 目录前言主要组件安装方法常见用途1. 操作Windows注册表2. 操作Windows服务3. 窗口操作

c++中的set容器介绍及操作大全

《c++中的set容器介绍及操作大全》:本文主要介绍c++中的set容器介绍及操作大全,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录​​一、核心特性​​️ ​​二、基本操作​​​​1. 初始化与赋值​​​​2. 增删查操作​​​​3. 遍历方

HTML img标签和超链接标签详细介绍

《HTMLimg标签和超链接标签详细介绍》:本文主要介绍了HTML中img标签的使用,包括src属性(指定图片路径)、相对/绝对路径区别、alt替代文本、title提示、宽高控制及边框设置等,详细内容请阅读本文,希望能对你有所帮助... 目录img 标签src 属性alt 属性title 属性width/h