Segformer网络数据流机制

2023-10-30

segformer网络架构

代码来源:https://github.com/bubbliiiing/segformer-pytorch

网络特点:

  1. 结合了Transformers与轻量级的多层感知机(MLP)解码器。
  2. 包含一个新颖的分层结构的Transformer编码器,该编码器输出多尺度特征。它不需要位置编码,因此避免了位置编码的插值,这在测试分辨率与训练时不同的情况下可能会导致性能下降。
  3. 避免使用复杂的解码器。提议的MLP解码器从不同的层中聚合信息,从而同时结合了局部注意力和全局注意力来呈现强大的表示。
  4. 设计非常简单和轻量级,这是在Transformers上实现高效分割的关键。
  5. SegFormer系列模型从SegFormer-B0到SegFormer-B5有多个版本,与之前的模型相比,它们的性能和效率都有显著的提高。

SegFormer.py码解析:

nets/segformer.py 文件中定义了与 SegFormer 相关的几个类:

  1. MLP:一个简单的多层感知机,将输入特征转化为所需的嵌入维度。
  2. ConvModule:一个卷积模块,包括卷积层、批量归一化和激活函数。
  3. SegFormerHead:定义了 SegFormer 的解码头。它接受从 backbone 提取的特征,并通过 MLP 将它们转化为所需的嵌入维度。然后,这些特征被上采样并融合,最后通过一个卷积层生成最终的语义分割结果。
  4. SegFormer:这是主要的 SegFormer 模型类。它首先选择一个预训练的 backbone(这里提到了多个版本,如 b0、b1 等),然后使用 SegFormerHead 进行解码。

从上述代码中,我们可以看到 SegFormer 的基本数据流:

  1. 输入图像首先通过选择的 backbone(例如 mit_b0、mit_b1 等)进行特征提取。
  2. 这些特征(通常是多尺度的)被传递给 SegFormerHead
  3. SegFormerHead 中,特征首先通过 MLP 被转化为所需的嵌入维度。
  4. 这些嵌入特征然后被上采样并融合。
  5. 最后,融合的特征通过一个卷积层得到最终的语义分割结果。

数据流及尺寸变化:输入为512x512x3的图片(使用b0主干网络)

Encoder

mit(backbone)

为了更好地理解输入图像在网络中的数据流和其尺寸如何变化,我们首先需要查看 backbone.py 文件中的内容,特别是与 mit_b0(B0 主干)相关的部分。这将帮助我们了解 backbone 的结构和每一层的输出尺寸。
在这里插入图片描述
OverlapPatchEmbed 这是一个通过2D卷积操作将图像分块并将其嵌入到指定的维度的模块。例如,如果输入图像尺寸为512x512x3,并且指定了卷积核大小为7、步长为4和嵌入维度为768,则该模块将输出的特征图的维度变为较小,但通道数增加。

backbone.py 文件中提取的代码片段中,我们可以看到 mit_b0MixVisionTransformer 的一个子类。从 MixVisionTransformer 的代码中,我们可以看到以下关于 mit_b0 主干的关键信息:

  • 使用了 OverlapPatchEmbed 进行图像嵌入,这将使图像分块,并通过2D卷积操作将其嵌入到指定的维度。
  • 接下来,输入经过一系列的 Transformer 模块进行特征提取。具体地,mit_b0 有4个部分,每部分由多个 Transformer 块组成。每个 Transformer 块都会保持其输入特征的尺寸不变。
    这是 mit_b0 类的定义,它是 MixVisionTransformer 的子类。我们可以从这个定义中提取以下关键参数和信息:
class mit_b0(MixVisionTransformer):
    def __init__(self, pretrained = False):
        super(mit_b0, self).__init__(
            embed_dims=[32, 64, 160, 256], num_heads=[1, 2, 5, 8], mlp_ratios=[4, 4, 4, 4],
            qkv_bias=True, norm_layer=partial(nn.LayerNorm, eps=1e-6), depths=[2, 2, 2, 2], sr_ratios=[8, 4, 2, 1],
            drop_rate=0.0, drop_path_rate=0.1)
        if pretrained:
            print("Load backbone weights")
            self.load_state_dict(torch.load("model_data/segformer_b0_backbone_weights.pth"), strict=False)
  1. 嵌入维度 (embed_dims):在网络的不同阶段,特征图的通道数(或嵌入维度)是 [32, 64, 160, 256]。这表示在第一阶段输出的特征图通道数为32,第二阶段为64,第三阶段为160,第四阶段为256。
  2. 头数 (num_heads):这是 Transformer 注意力机制中的多头注意力的头数。在不同的阶段,头数分别是 [1, 2, 5, 8]。
  3. MLP比率 (mlp_ratios):这决定了 MLP 中隐藏层的大小。在所有阶段,比率都是4。
  4. QKV偏差 (qkv_bias):设置为 True,这意味着 Transformer 中的 QKV 矩阵都有偏差项。
  5. 规范化层 (norm_layer):使用 LayerNorm,并设置 epsilon 为 1e-6。
  6. 深度 (depths):表示在每个阶段中有多少个 Transformer 块。在这种情况下,每个阶段都有2个 Transformer 块。
  7. SR比率 (sr_ratios):这些是空间缩减的比率,它们决定了在各个阶段如何减少特征图的尺寸。
  8. Dropout比率 (drop_ratedrop_path_rate):这些是常规 dropout 和路径 dropout 的比率。

最后,如果在train.py中将 pretrained 设置为 True,那么会从指定的路径加载预训练的 mit_b0 主干的权重。

现在,让我们结合这个定义和之前的分析来详细描述 mit_b0 的数据流和每一步的尺寸变化。

Stage

  1. 输入:输入图像的尺寸为 512 × 512 × 3 512 \times 512 \times 3 512×512×3

  2. PatchEmbed:输入图像首先通过 PatchEmbed 层。这一步的具体操作是将图像分块,并通过2D卷积操作将其嵌入到指定的维度。经过 PatchEmbed 之后的输出尺寸是 128 × 128 × 32 128 \times 128 \times 32 128×128×32

  3. Stage1

    • Transformer 块:包含2个 Transformer 块(由 depths 参数给出),每个块都包括注意力机制和 MLP。
    • 输出尺寸:由于每个 Transformer 块都不会改变其输入特征的尺寸,因此第一阶段的输出尺寸仍然是 128 × 128 × 32 128 \times 128 \times 32 128×128×32
  4. Stage2

    • Transformer 块:同样包含2个 Transformer 块。
    • 输出尺寸:考虑到 embed_dims 参数,这一阶段的输出尺寸应为 64 × 64 × 64 64 \times 64 \times 64 64×64×64(这里假设特征图的尺寸减半)。
  5. Stage3

    • Transformer 块:同样包含2个 Transformer 块。
    • 输出尺寸:考虑到 embed_dims 参数,这一阶段的输出尺寸应为 32 × 32 × 160 32 \times 32 \times 160 32×32×160(这里假设特征图的尺寸再次减半)。
  6. Stage4

    • Transformer 块:同样包含2个 Transformer 块。
    • 输出尺寸:考虑到 embed_dims 参数,这一阶段的输出尺寸应为 16 × 16 × 256 16 \times 16 \times 256 16×16×256(这里假设特征图的尺寸再次减半)。

Transformer Block

在这里插入图片描述

class Block(nn.Module):
    def __init__(self, dim, num_heads, mlp_ratio=4., qkv_bias=False, qk_scale=None, drop=0., attn_drop=0.,
                 drop_path=0., act_layer=GELU, norm_layer=nn.LayerNorm, sr_ratio=1):
        super().__init__()
        self.norm1      = norm_layer(dim)
        
        self.attn       = Attention(
            dim, num_heads=num_heads, qkv_bias=qkv_bias, qk_scale=qk_scale,
            attn_drop=attn_drop, proj_drop=drop, sr_ratio=sr_ratio
        )
        self.norm2      = norm_layer(dim)
        self.mlp        = Mlp(in_features=dim, hidden_features=int(dim * mlp_ratio), act_layer=act_layer, drop=drop)

        self.drop_path  = DropPath(drop_path) if drop_path > 0. else nn.Identity()
        
        self.apply(self._init_weights)

    def _init_weights(self, m):
        if isinstance(m, nn.Linear):
            trunc_normal_(m.weight, std=.02)
            if isinstance(m, nn.Linear) and m.bias is not None:
                nn.init.constant_(m.bias, 0)
        elif isinstance(m, nn.LayerNorm):
            nn.init.constant_(m.bias, 0)
            nn.init.constant_(m.weight, 1.0)
        elif isinstance(m, nn.Conv2d):
            fan_out = m.kernel_size[0] * m.kernel_size[1] * m.out_channels
            fan_out //= m.groups
            m.weight.data.normal_(0, math.sqrt(2.0 / fan_out))
            if m.bias is not None:
                m.bias.data.zero_()

    def forward(self, x, H, W):
        x = x + self.drop_path(self.attn(self.norm1(x), H, W))
        x = x + self.drop_path(self.mlp(self.norm2(x), H, W))
        return x

一个 Block 包含了一个注意力模块 (Attention) 和一个多层感知机 (Mlp)。

  1. 规范化层 (norm_layer):每个 Block 在输入注意力模块和 MLP 之前都有一个规范化层。这是一种预处理步骤,用于标准化输入数据,使其具有零均值和单位方差。

  2. 注意力模块 (Attention):输入数据经过注意力模块进行处理。这个模块包含一个或多个自注意力头,这些头可以分别学习输入的不同方面。这个模块的输出与原始输入相加,形成一个残差连接。

  3. 多层感知机 (Mlp):这是一个简单的全连接网络,由一个或多个线性层和一个非线性激活函数组成。这个模块的输出也与原始输入相加,形成一个残差连接。

  4. DropPath:这是一种特殊的 Dropout 技术,用于正则化网络并防止过拟合。它在训练过程中随机丢弃某些路径,而不是丢弃单个节点。

结合这个定义和之前的分析,详细解释 Block 的数据流和每一步的输入输出尺寸变化:

  1. 输入:输入 x 的尺寸为 ((N, C, H, W)),其中 N 是批量大小,C 是通道数,HW 分别是输入特征图的高度和宽度。输入还包括 HW 本身,这可能与空间缩减 (sr_ratio) 有关,但这需要查看 Attention 模块的实现来进一步确定。

  2. 规范化层:输入 x 首先经过规范化层 norm1,这不会改变输入的尺寸,所以输出尺寸仍然是 ((N, C, H, W))。

  3. 注意力模块:经过规范化的输入接下来进入注意力模块。注意力模块的具体工作方式需要查看 Attention 类的实现来确定,但在大多数情况下,它不会改变特征的尺寸。因此,我们可以假设注意力模块的输出尺寸仍然是 ((N, C, H, W))。

  4. 残差连接:注意力模块的输出与原始输入相加,形成一个残差连接。这也不会改变特征的尺寸,所以此步骤后的输出尺寸仍然是 ((N, C, H, W))。

  5. 第二个规范化层和 MLP:注意力模块的输出经过第二个规范化层和 MLP。与前面的规范化层和注意力模块类似,这些操作也不会改变特征的尺寸,所以 MLP 的输出尺寸仍然是 ((N, C, H, W))。

  6. 第二个残差连接:MLP 的输出与其输入相加,形成第二个残差连接。这也不会改变特征的尺寸,所以此步骤后的输出尺寸仍然是 ((N, C, H, W))。

所以,对于 Block 类,我们可以得出以下结论:无论输入特征的尺寸是什么,输出特征的尺寸都将是相同的。这是因为所有的操作,包括注意力模块、MLP 和残差连接,都保持特征的尺寸不变。希望这能帮助您更好地理解 Block 的结构和工作原理!


解码头 (Head):

在这里插入图片描述

  1. MLP解码器:首先,每个特征图 c 1 , c 2 , c 3 , c 4 c1, c2, c3, c4 c1,c2,c3,c4(这些特征来自 mit_b0 主干)都通过一个 MLP 层进行处理,将其转化为指定的嵌入维度(embedding_dim)。

  2. 上采样:经过 MLP 的特征图 c 4 , c 3 , c 2 c4, _c3, _c2 c4,c3,c2 都被上采样到与 c 1 c1 c1相同的尺寸。

  3. 特征融合:接下来,所有的特征图都被串联在一起,并通过一个卷积模块 (linear_fuse) 进行融合。

  4. 预测:最后,融合的特征图经过一个卷积层生成最终的语义分割结果。

为了明确每一步的输出尺寸,我们可以总结如下:

  1. 输入尺寸:

    • c 1 c1 c1 128 × 128 × 32 128 \times 128 \times 32 128×128×32
    • c 2 c2 c2:尺寸较小,但经过上采样后为 128 × 128 × 64 128 \times 128 \times 64 128×128×64
    • c 3 c3 c3:尺寸更小,但经过上采样后为 128 × 128 × 160 128 \times 128 \times 160 128×128×160
    • c 4 c4 c4:尺寸最小,但经过上采样后为 128 × 128 × 256 128 \times 128 \times 256 128×128×256
  2. 经过 MLP 和上采样后,所有的特征图都有相同的尺寸 128 × 128 128 \times 128 128×128,但通道数为嵌入维度(embedding_dim)。

  3. 融合后的特征图尺寸为 128 × 128 × e m b e d d i n g _ d i m 128\times 128\times embedding\_ dim 128×128×embedding_dim

  4. 最终的语义分割输出尺寸为 128 × 128 × n u m _ c l a s s e s 128\times 128\times num\_ classes 128×128×num_classes

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Segformer网络数据流机制 的相关文章

  • 思腾合力赞助CCF YOCSEF太原第十一届学术委员会第三次全体会议

    2024年1月6日 由思腾合力赞助的 CCF YOCSEF太原第十一届学术委员会第三次全体会议暨AC换届选举活动 在山西大学举办 华北区教育行业负责人宋肖敏出席本次会议 会议汇聚了众多学术界和企业界的精英 共同探讨人工智能和计算机科学的未来
  • 第八章 确认访问用户身份的认证

    第八章 确认访问用户身份的认证 8 1 何为认证 在计算机安全和网络通信的背景下 认证是 确认实体 如用户 计算机系统 服务 身份真实性的过程 认证是确保系统只对合法用户或实体开放访问权限的一种关键机制 在网络通信中 认证通常涉及验证用户或
  • 八路视频光端机技术导论:多通道视频传输的高效解决方案

    随着光通信技术的快速发展 八路视频光端机 已成为多通道视频传输的有效解决方案 本文将探讨该技术的原理 优势及应用前景 为光通信行业的技术人员和研究学者提供参考 技术原理 八路视频光端机基于 波分复用 WDM 技术 通过一个光纤同时传输多路视
  • 论文查重部分算不算重复率呢

    大家好 今天来聊聊论文查重部分算不算重复率呢 希望能给大家提供一点参考 以下是针对论文重复率高的情况 提供一些修改建议和技巧 可以借助此类工具 论文查重部分算不算重复率呢 在论文查重过程中 查重部分是否计入重复率是一个关键问题 本文将从七个
  • 6类典型场景的无线AP选型和部署方案

    你们好 我的网工朋友 前段时间刚给你们来了篇解决无线频繁断网的技术文 解决无线频繁断网 这个办法值得收藏 不少朋友私聊 说想再聊聊无线AP的选型和部署方案 这不就安排上了 无线网络覆盖项目中 无线AP的合理选型和部署非常重要 在设计施工中
  • Google Earth Engine(GEE)深度学习入门教程- GEE导出篇

    GEE导出篇 官方教程 TFRecord 和地球引擎 在GEE的JS Code Editor中 我们按照我们的需要去处理对应的遥感影像 得到处理后Image影像 为了导出后读取数据 在导出前 一定清楚每个波段的名称 不然没法读取 深度学习数
  • 这些专利知识你知道吗?

    专利作为一种重要的知识产权保护形式 专利不仅成为了企业核心竞争力的重要组成部分 也成为了国家创新发展的重要支撑 专利是指国家专利主管机关授予发明创造申请人的一种专有权 这种专有权具有独占性 排他性和法律强制性 能够为持有者带来经济利益和竞争
  • 概述:利用大模型 (LLMs) 解决信息抽取任务

    论文标题 Large Language Models for Generative Information Extraction A Survey 论文链接 https arxiv org pdf 2312 17617 pdf 论文主要探讨
  • 毕业设计-基于深度学习的细菌微生物目标检测系统系统 YOLO python 目标检测 人工智能 卷积神经网络 机器学习

    目录 前言 设计思路 一 课题背景与意义 二 算法理论原理 2 1 CBAM模块 2 2 损失函数 三 检测的实现 3 1 数据集 3 2 实验环境搭建 3 3 实验及结果分析 实现效果图样例 最后 前言 大四是整个大学期间最忙碌的时光 一
  • 5个步骤,教你瞬间明白线程和线程安全

    记得今年3月份刚来杭州面试的时候 有一家公司的技术总监问了我这样一个问题 你来说说有哪些线程安全的类 我心里一想 这我早都背好了 稀里哗啦说了一大堆 他又接着问 那你再来说说什么是线程安全 然后我就GG了 说真的 我们整天说线程安全 但是对
  • 线程安全(中)--彻底搞懂synchronized(从偏向锁到重量级锁)

    接触过线程安全的同学想必都使用过synchronized这个关键字 在java同步代码快中 synchronized的使用方式无非有两个 通过对一个对象进行加锁来实现同步 如下面代码 synchronized lockObject 代码 对
  • 用通俗易懂的方式讲解:内容讲解+代码案例,轻松掌握大模型应用框架 LangChain

    本文介绍了 LangChain 框架 它能够将大型语言模型与其他计算或知识来源相结合 从而实现功能更加强大的应用 接着 对LangChain的关键概念进行了详细说明 并基于该框架进行了一些案例尝试 旨在帮助读者更轻松地理解 LangChai
  • 如何使用Imagewheel搭建一个简单的的私人图床无公网ip也能访问

    文章目录 1 前言 2 Imagewheel网站搭建 2 1 Imagewheel下载和安装 2 2 Imagewheel网页测试 2 3 cpolar的安装和注册 3 本地网页发布 3 1 Cpolar临时数据隧道
  • 基于java的物业管理系统设计与实现

    基于java的物业管理系统设计与实现 I 引言 A 研究背景和动机 物业管理系统是指对物业进行管理和服务的系统 该系统需要具备对物业信息 人员信息 财务信息等进行管理的能力 基于Java的物业管理系统设计与实现的研究背景和动机主要体现在以下
  • 网络安全(黑客)自学启蒙

    一 什么是网络安全 网络安全是一种综合性的概念 涵盖了保护计算机系统 网络基础设施和数据免受未经授权的访问 攻击 损害或盗窃的一系列措施和技术 经常听到的 红队 渗透测试 等就是研究攻击技术 而 蓝队 安全运营 安全运维 则研究防御技术 作
  • 用CHAT分析高校体育智慧教学体系构建与探索研究现状

    CHAT回复 现阶段 高校体育智慧教学体系的构建与探索研究还处于初级阶段 但全球数字化转型大潮的推动下 一些较为前沿的研究和实践已经开始出现 1 教学平台的建设 很多高校已经开始尝试使用在线教育平台进行体育教学 把传统的面对面授课模式转变为
  • 毕业设计- 基于深度学习的小样本时间序列预测算法 - Attention

    目录 前言 课题背景与意义 课题实现 一 数据集 二 设计思路 三 相关代码示例 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着准备考研 考公 考教资或者实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力 近几年各个学校
  • 深度学习:人脸识别系统 Tensorflow 人脸检测 Python语言 facenet人脸识别算法 毕业设计(源码)✅

    博主介绍 全网粉丝10W 前互联网大厂软件研发 集结硕博英豪成立工作室 专注于计算机相关专业 毕业设计 项目实战6年之久 选择我们就是选择放心 选择安心毕业 感兴趣的可以先收藏起来 点赞 关注不迷路 毕业设计 2023 2024年计算机毕业
  • 静态综合实验

    1 IP地址划分 192 168 1 0 27 用于主干拆分 192 168 1 32 27 用于用户拆分 192 168 1 64 27 用于用户拆分 192 168 1 96 27 用于用户拆分 192 168 1 128 27 用于用
  • 【安全】简单解析统一身份认证:介绍、原理和实现方法

    深入解析统一身份认证 介绍 原理和实现方法 导语 统一身份认证是什么 统一身份认证的原理 统一身份认证的实现 结语 导语 随着互联网的发展和各种在线服务的普及 用户在不同的应用和平台上需要进行多次身份验证 为了简化用户的登录和减少重复操作

随机推荐

  • 数学建模学习笔记——线性规划

    数学建模学习笔记 线性规划 一 基础知识储备 1 线性规划 1 1标准形式 1 2非标准形式 1 3多目标规划 2 运输问题 3 指派问题 4 对偶理论与灵敏度分析 二 章节习题解答 Q3 Q4 Q5 Q6 Q8 Q9 本文章为 数学建模算
  • Unity 3D 博客汇总

    附录 X4 作业优秀博客汇总 目录 文章目录 附录 X4 作业优秀博客汇总 1 最有价值个人博客 Valuable Person Blogs 2 博客表达技巧与游戏创新 2 1 写读者欢迎的游戏博客 2 2 师兄师姐谈游戏创新 竞赛经验谈
  • Vector、deque、list三者之间的区别!!!

    vector 是一段连续的内存块 而deque 是多个连续的内存块 list 是所有 数据元素分开保存 可以是任何两个元素没有连续 vector 的查询性能最好 并且在末端增加数据也很好 除非它重新申请内存段 适合高效地随机存储 list
  • Java问题诊断和排查工具(查看JVM参数、内存使用情况及分析等)

    JDK自带的工具 在JDK的bin目录下有很多命令行工具 我们可以看到各个工具的大小基本上都稳定在27kb左右 这个不是JDK开发团队刻意为之的 而是因为这些工具大多数是jdk lib tools jar类库的一层薄包装而已 他们的主要功能
  • Windows批处理(cmd/bat)快速新建文件夹

    Windows批处理 cmd bat 快速新建文件夹 在进行毕业设计时 随着每日的任务不同 需要新建不同文件夹来区分任务 但手敲新建重命名太过繁琐 经过资料的查找 找到了在windows系统下bat文件的快速新建文件夹的方法 效果展示如下
  • 怎么让一个APP没有桌面图标!

    直入正题 在AndroidManifest xml中 注意 包含 action android name android intent action MAIN 的activity必须是application标签中第一个activity
  • C语言中将数字转换为字符串的方法

    C语言提供了几个标准库函数 可以将任意类型 整型 长整型 浮点型等 的数字转换为字符串 以下是用itoa 函数将整数转换为字符串的一个例子 include
  • 若依框架加入element-ui的input输入框,远程搜索用后端数据的,简单易上手

    我先展示一个最终效果 两种 设备信息用的是 el select gt 设备借还记录用的是el autocomplete gt 用的若依框架 做一个element ui的input输入框 远程搜索用后端数据的 我先说一下 我是三个表 一个厂家
  • 虚继承详解及其内存分布

    什么是虚继承 根据百度百科 虚继承 是面向对象编程中的一种技术 是指一个指定的基类 在继承体系结构中 将其成员数据实例共享给也从这个基类型直接或间接派生的其它类 虚拟继承是多重继承中特有的概念 虚拟基类是为解决多重继承而出现的 如上图 假设
  • 学习笔记 JavaScript ES6 Set

    学习内容 常用方法 遍历 应用场景 WeakSet 一种新的数据结构 set和array数组很像 不过array中可以有重复的值 而set里的值是唯一的 let s new Set console log s let s1 new Set
  • 【PCL-8】方向包围盒OBB

    AABB包围盒 边平行于坐标轴的最小六面体 方向包围盒OBB 相对于坐标轴方向任意的最小立方体 最小包围盒计算流程 1 利用PCA主元分析法获得点云的三个主方向 获取质心 计算协方差 得到协方差矩阵 求取协方差矩阵的特征值和特征向量 特征向
  • 【time series】时间序列领域的Transformer综述论文笔记

    论文名称 Transformers in Time Series A Survey 论文年份 2022 5 7 论文作者 阿里巴巴达摩院 论文下载 https arxiv org abs 2202 07125 论文源码 https gith
  • 零基础CSS入门教程(8)——CSS设置字体

    本章目录 1 任务目标 2 css设置字体 3 代码演示 4 小结 1 任务目标 我们前几个小结学习了 css的选择器 和及基本的改变字体颜色 我们这一小结学习一下设置字体的一些功能 2 css设置字体 1 font size这个是设置字体
  • Link Cut Tree (动态树)【P3690】

    题目链接 给定n个点以及每个点的权值 要你处理接下来的m个操作 操作有4种 操作从0到3编号 点从1到n编号 0 后接两个整数 x y 代表询问从x到y的路径上的点的权值的xor和 保证x到y是联通的 1 后接两个整数 x y 代表连接x到
  • springboot websocket 传递 头信息 协议头 token 的前后端解决方案

    文章目录 一 前言 二 js websocket 传递token 2 1 基于协议头 三 后台取出websocket协议头的参数 3 1 取出token 3 2 注意大坑 四 结尾 一 前言 关于springboot websocket 可
  • python3 爬虫实战之爬取网易新闻APP端

    一 使用工具 这里使用了火狐浏览器的user agent插件 不懂的可以点这里火狐插件使用 二 爬虫操作步骤 百度 网易新闻并选择 步骤一 步骤二 步骤三 步骤四 最后一步 注意点 1 网易新闻类型 一共是下面的几种 BBM54PGAwan
  • DataSpell学习

    今天刚发现一个有用的数据分析软件DataSpell 下载地址 https www jetbrains com zh cn dataspell features 安装很简单 按照步骤一路来就行了 支持ipynb文件 其实和jupyter no
  • pip3 install命令执行时指定源+指定版本

    1 指定源 用法 pip3 install i https pypi tuna tsinghua edu cn simple 3rd MODULE NAME 例如 pip3 install i https pypi tuna tsinghu
  • Ubuntu下为可执行文件和脚本文件(.sh)生成桌面快捷方式

    1 前言 在Ubuntu中 有些软件是安装的 如deb的安装包 用dpkg i安装 有些软件可能是不需要安装 直接解压tar gz这类文件直接就可以运行了 但是每次运行的时候都要输入一遍命令十分麻烦 因此想把它建个快捷方式放到桌面或启动栏里
  • Segformer网络数据流机制

    代码来源 https github com bubbliiiing segformer pytorch 网络特点 结合了Transformers与轻量级的多层感知机 MLP 解码器 包含一个新颖的分层结构的Transformer编码器 该编