学习Se-net和Sk-net 附网络简单代码(pytorch)

(一)Se-net的原理和思路
    Se-net严格来说是一个小结构,它可以直接插入已有的网络结构中,帮助原有结构获得更好的效果,如插入Resnet网络中。
在这里插入图片描述

Se-net的整个流程如下:
    (1)假设一个特征图,它的维度是(1,3,255,255),首先将它进行一般卷积。这个过程也可以是其他网络的操作过程。之后我们得到一个新的维度的特征图,假设卷积块为64个,那么输出的特征图的维度为(1,64,255,255)。
    (2)在以往的网络中,我们仅仅是对网络通过深度学习的方法来优化参数的值,这Se-net中我们引入了通道注意力机制这是因为64个通道代表了图像不同的特征分布,引入注意力机制我们可以给不同通道不同的权重,以便于该通道在后续的计算中占据更重要的成分,这样有助于我们更好的捕捉不同区域的特征。
    所以这里我们首先需要抽象提取出每一个通道的整体特征参数,这里根据论文的测试,选用的全局平均池化,它将维度从(1,64,255,255)可以变化为(1,64,1,1)然后通过全连接->激活->全连接->sigmoid的连接获得每一个通道的权重参数。这里用sigmoid也是根据测试得出来的。然后在用简单的乘法对原数据进行权重增减。这样就获得了一个新的特征图,它在理论上能够更好的表达的图片的特征。

(二)Se-net网络代码实现
    以下只给出一个网络本身的定义,代码还是很好理解的,在 super里定义清楚每一层的输入输出量就可以了,这里指的注意的是他有一个reduction量,他是用来调节线性层负责度的参数,在综合性能和复杂度的基础上选择16作为默认值。

class SELayer(nn.Module):
    def __init__(self, channel, reduction=16):
        super(SELayer, self).__init__()
        self.avg_pool = nn.AdaptiveAvgPool2d(1)  
        self.fc = nn.Sequential(
            nn.Linear(channel, channel // reduction, bias=False),  
            nn.ReLU(inplace=True),
            nn.Linear(channel // reduction, channel, bias=False),
            nn.Sigmoid()
        )

    def forward(self, x):
        b, c, _, _ = x.size()
        y = self.avg_pool(x).view(b, c)  
        y = self.fc(y).view(b, c, 1, 1)  
        return x * y.expand_as(x)

(三)Se-net+Resnet
    左图是ResNet结构,右图是ResNet和Se-net联合的网络,可以看到添加的部分就是Se-net的核心。
在这里插入图片描述

    这里也就是在基础的Resnet中添加了Se-net模块,这里这个模块应该添加在哪里在论文中也是做了比较的,给的代码只是一个参考位置。

self.conv1 = nn.Conv2d(mid_channels, mid_channels, 3, 1, 1, bias=True)
self.conv2 = nn.Conv2d(mid_channels, mid_channels, 3, 1, 1, bias=True)
self.avd_layer = nn.AvgPool2d(3, 1, padding=1)
self.relu = nn.ReLU(inplace=True)
self.se = SELayer(64, 16)

residual = x
out = self.conv1(x)
out = self.relu(out)
out = self.conv2(out)
out = self.se(out)

out += residual
out = self.relu(out)

return out

(四)SK-net的原理和思路
    省略掉过程其实SK-net和Se-net的思路是有贴近的地方的,它们都是输入一个图片特征,通过一定处理使得卷积后的图片特征的每个通道的权重不一样。Se-net是根据注意力机制,学习到了不同的权重,而SK-net是根据自适应卷积的方式来挑选和融合出不同的卷积,也就是每一个通道都可以选择最适合自己的卷积块(以及使用不同的感受野来获取图像特征)。
在这里插入图片描述
SK-net的整个流程如下:
(1)Split划分
    首先使用不同的卷积核获得两个不同的特征图。
(2)Fuse融合
    融合两个不同的特征图,然后将它们通过全局平均池化的方式提取出每一个通道的融合值。再通过线性层进行通过压缩,这里和Se-net的通道注意力是一样的。
(3)Select选择
    在通过一个Softmax层进行选择,后续的操作和Se-net是一样的,得到通过挑选的特征图。这里的特征图可以看到每一个通道所使用的卷积核是不一样的,也是通过学习得到的。

(五)SK-net网络代码实现
    在网络里主要有①获得不同的卷积块②全局平均池化层③线性层④softmax层。所以在super函数里主要就是对这几个部分进行初始化。同时因为卷积块可以有多个不只有两个,线性层的压缩量等参数都可以自己设定,所以也需要初始化。这里的d就是线性层压缩后的通道数量,M是采用的卷积块个数,首先要初始化卷积不同的卷积块,再定义全局平均池化,再定义几个线性层和softmax函数,注意每一层的输入输出值。

d = max(in_channels//r, L)
self.M = M
self.out_channels = out_channels
self.conv = nn.ModuleList()
for i in range(M):
    self.conv.append(nn.Sequential(nn.Conv2d(in_channels, out_channels, 3, stride, padding=1+i, dilation=1+i, groups=32, bias=False),
                                   nn.BatchNorm2d(out_channels),
                                   nn.ReLU(inplace=True)))
self.global_pool = nn.AdaptiveAvgPool2d(output_size=1)
self.fc1 = nn.Sequential(nn.Conv2d(out_channels, d, 1, bias=False),
                           nn.BatchNorm2d(d),
                           nn.ReLU(inplace=True))
self.fc2 = nn.Conv2d(d, out_channels*M, 1, 1, bias=False)
self.softmax = nn.Softmax(dim=1)

    在前馈函数里,首先需要执行split的过程,使用reduce将对初始特征图采用不同卷积块卷积后的特征图进行相加。然后全局池化,之后进行两个线性层,再通过softmax,后续操作和Se-net相同,注意一下每一层的参数,和怎么进行拼贴等问题就行了。

def forward(self, input):
    batch_size = input.size(0)
    output = []

    for i, conv in enumerate(self.conv):
        output.append(conv(input))
    U = reduce(lambda x, y:x+y, output)

    s = self.global_pool(U)
    z = self.fc1(s)
    a_b = self.fc2(z)
    a_b = a_b.reshape(batch_size,self.M,self.out_channels,-1)
    a_b = self.softmax(a_b)

    a_b = list(a_b.chunk(self.M,dim=1))
    a_b = list(map(lambda x:x.reshape(batch_size,self.out_channels,1,1),a_b))
    V = list(map(lambda x,y:x*y,output,a_b))
    V = reduce(lambda x,y:x+y,V)
    return V

    SK-net网络和Se-net网络其实是一样的不能称作一个完整的网络,它可以是一个增加模块嵌入到一些网络中,SK-net也可以嵌入和Resnet中进行补强,嵌入和方法和Se-net类似。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Cisco 产品下载链接汇总 2023 持续更新中

Cisco 产品链接汇总 2023 持续更新中 IOS-XE, IOS-XR, NX-OS & FXOS based on linux kernel 请访问原文链接:https://sysin.org/blog/cisco/,查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org 本站 Cisco 产品汇…

Java是如何实现双亲委托机制的

Java 是一种面向对象的编程语言,它有一套独特的类加载机制。其中,双亲委托加载机制是 Java 类加载机制中的一个重要概念。本文将介绍 Java 的双亲委托加载机制是如何实现的,并解释其作用和优点。 Java 类加载机制 在 Java 中,类的…

ADAS/AD笔记之特斯拉Autopilot-HW3.0系统

摘要: 目前国内一般直接将高速NOA成为“L2”;因此,复杂度更高的城区NOA,就自然的映射到了“L2”。 一、概述: 特斯拉Autopilot系统首创了NOA这种淡化脱手/脱眼/脱脑(驾驶自动化程度)逻辑的功能…

基础知识(王爽老师书第一章)

文章目录 基础知识1.1 引言1.2 机器语言1.2 引言汇编语言的产生1.3 汇编语言的组成1.4 存储器1.5 指令和数据1.6 存储单元1.7 CPU对存储器的读写1.8 地址总线1.9 数据总线1.10 控制总线小结检测点1.11.11 内存地址空间1.12 主板1.13 接口卡1.14 各类存储器芯片1.15 内存地址空间…

新版android studio gradle插件7.4.2.pom一直无法下载问题

android studio同步时候出现org.gradle.api.plugins.UnknownPluginException,Plugin [id: com.android.application, version: 7.4.2] was not found in any of the following sources: pom插件一直无法下载,搞了好几天,简直想砸电脑&#x…

java版企业电子招投标系统源代码之了解电子招标投标全流程

随着各级政府部门的大力推进,以及国内互联网的建设,电子招投标已经逐渐成为国内主流的招标投标方式,但是依然有很多人对电子招投标的流程不够了解,在具体操作上存在困难。虽然各个交易平台的招标投标在线操作会略有不同&#xff0…

【RabbitMQ】| Lion带你 (超详细) 从0到1使用SpringBoot操作RabbitMQ

目录 一. 🦁 前言二. 🦁 SpringBoot操作RabbitMQⅠ. 前期准备工作1. 创建项目(不细说)2. 添加依赖3. 编写配置文件 Ⅱ. 创建队列和交换机Ⅲ. 创建生产者Ⅳ. 创建消费者 三. 🦁 总结 一. 🦁 前言 Spring Bo…

ChatGPT:使用Edge浏览器获取ChatGPT以及如何使用ChatGPT帮你制作PPT

一:前言 ChatGPT:智能AI助你畅聊天地 在现代人日益忙碌的生活中,难免需要一些轻松愉快的聊天来放松身心。而现在,有了 ChatGPT,轻松愉快的聊天变得更加智能、有趣且不受时间、地点限制! 什么是 ChatGPT&…

Vue3 +TypeScript 引入 BabylonJs(Vue3实现3D)【一篇文章精通系列】

本文主要介绍如何使用Vue3和TypeScript引入BabylonJs技术实现3D效果。结合实际案例,详细讲解了如何在Vue3项目中引入BabylonJs,并了解其相关知识。通过本文的学习,相信读者可以轻松掌握Vue3实现3D效果以及BabylonJs的相关知识。 Vue3 TypeS…

实验10 人工神经网络(1)

1. 实验目的 ①理解并掌握误差反向传播算法; ②能够使用单层和多层神经网络,完成多分类任务; ③了解常用的激活函数。 2. 实验内容 ①设计单层和多层神经网络结构,并使用TensorFlow建立模型,完成多分类任务&#xf…

JavaWeb13-JavaScript 开发利器之 jQuery-01

1. 说明 1.1 现状 1、jquery 使用情况 2、Vue 使用情况 1.2 官方文档 学习地址: https://www.w3school.com.cn/jquery/index.asp API地址: https://jquery.cuishifeng.cn/ 1.3 JQuery 是什么? 1.3.1 基本介绍 jQuery 是一个快速的,简洁的 javaScript 库…

node笔记_koa框架是什么?

文章目录 ⭐前言⭐ koa框架是如何发展而来的?⭐ koa框架的基本使用💖 安装 koa💖 koa的Middleware示例💖 支持xml ⭐ 结束 ⭐前言 大家好,我是yma16,本文介绍node的一个web框架koa。 往期文章 node_window…

单片机c51中断 — 中断扫描法行列式键盘

项目文件 文件 关于项目的内容知识点可以见专栏单片机原理及应用 的第五章,中断 在第4章中已介绍过行列式键盘的工作原理,并编写了相应的键盘扫描程序。但应注意的是,在单片机应用系统中,键盘扫描只是 CPU 工作的内容之一。CPU …

对接ChatGPT开发对话机器人小程序

前言 ChatGPT已经非常火爆了,企业开始招聘ChatGPT工程师,可能对接ChatGPT接口进行企业级开发是程序员必备的技能了。本篇文章主要是基于ChatGPT开发接口进行对接,使用微信小程序制作一款自己的聊天机器人,通过这一案例你可以展开…

对称加密/非对称加密

古典密码学 起源于古代战争:在战争中,为了防止书信被截获后重要信息泄露,人们开始对书信进行加密。 移位式加密 如密码棒,使用布条缠绕在木棒上的方式来对书信进行加密。 加密算法:缠绕后书写 密钥: 木棒的尺寸 替…

chatgpt如何引入领域知识?mit团队利用gpt4做数据增强来提升小模型在特定领域的效果

一、概述 title:Dr. LLaMA: Improving Small Language Models in Domain-Specific QA via Generative Data Augmentation 论文地址:Paper page - Dr. LLaMA: Improving Small Language Models in Domain-Specific QA via Generative Data Augmentation…

[网络安全]DVWA之XSS(Reflected)攻击姿势及解题详析合集

[网络安全]DVWA之XSS(Reflected)攻击姿势及解题详析合集 XSS(Reflected)-low level源代码姿势 XSS(Reflected)-medium level源代码姿势1.双写绕过2.大小写绕过 XSS(Reflected)-high level源代码str_replace函数 姿势 XSS(Reflected)-Impossible level源代…

Linux---相关介绍、相关下载、连接Linux系统、虚拟机快照

1. Linux系统相关 内核提供了Linux系统的主要功能,如硬件调度管理的能力。 Linux内核是免费开源的,是由林纳斯托瓦兹在1991年创立并发展至今成为服务器操作系统领域的 核心系统。 内核无法被用户直接使用,需要配合应用程序才能被用户使用…

简单网络管理协议 SNMP

文章目录 1 概述1.1 结构1.2 操作 2 SNMP2.1 报文格式2.2 五大报文类型 3 扩展3.1 网工软考真题 1 概述 #mermaid-svg-95KMV1m3prKJgwv1 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-95KMV1m3prKJgwv1 .error-ico…

spring 容器结构/机制debug分析--Spring 学习的核心内容和几个重要概念--IOC 的开发模式--综合解图

目录 Spring Spring 学习的核心内容 解读上图: Spring 几个重要概念 ● 传统的开发模式 解读上图 ● IOC 的开发模式 解读上图 代码示例—入门 xml代码 注意事项和细节 1、说明 2、解释一下类加载路径 3、debug 看看 spring 容器结构/机制 综合解图 Spring Spr…
最新文章