多标签分类论文笔记 | ML-Decoder: Scalable and Versatile Classification Head

个人论文精读笔记,主要是翻译+心得,欢迎旁观,如果有兴趣可以在评论区留言,我们一起探讨。
Paper: https://arxiv.org/pdf/2111.12933.pdf
Code: https://github.com/Alibaba-MIIL/ML_Decoder

文章目录

  • 0. 摘要
  • 1. 介绍
  • 2. 方法
    • 2.1 Baseline分类头
    • 2.2 回顾-Attention and Transformer-Decoder
    • 2.3 ML-Decoder
  • 3. 实验研究
    • 3.1 查询类型比较
    • 3.2 比较不同分类头
    • 3.3 Zero-shot学习
  • 4. 实验结果
    • 4.1 多标签分类
    • 4.2 Zero-shot学习
    • 4.3 单标签分类
  • 5. 结论与未来工作

0. 摘要

  • 翻译
    本文介绍了一种新的基于注意力的分类头——ML-Decoder。ML-Decoder通过查询预测类标签的存在,与全局平均池化相比,它能够更好地利用空间数据。通过重新设计解码器架构,并使用一种新颖的组解码方案,ML-Decoder具有很高的效率,并且可以很好地扩展到数千个类。与使用更大的主干相比,ML-Decoder始终提供更好的速度-精度权衡。ML-Decoder也是通用的——它可以作为各种分类头的临时替代品,并且在与单词查询操作时推广到不可见的类。新颖的查询扩充进一步提高了其泛化能力。使用ML-Decoder,我们在几个分类任务上取得了最先进的结果:在MS-COCO多标签上,我们达到了91.4%的mAP;在NUS-WIDE的zero-shot上,我们达到了31.1%的ZSL(Zero shot learning) mAP;在ImageNet单标签上,我们在没有额外数据或蒸馏的情况下,用vanilla ResNet50主干达到了80.7%的新最高分。

  • 笔记

    1. 摘要主要讲了下ML-Decoder不同于一般的全局平均池化,通过查询来预测类别能更好的利用空间信息;
    2. 跟更大的backbone相比,ML-Decoder能更好权衡速度-精度;
    3. ML-Decoder也是通用的——它可以作为各种分类头的临时替代品,并且在与单词查询操作时推广到不可见的类;
    4. 最后展示了下实验数据,能在不同数据集上多标签分类的任务达到SOTA的性能;

1. 介绍

先说了一下图像分类的概念,可以根据图像中的物体分配一个或多个标签,那么分配一个标签的就是单分类,多个标签就是多分类。然后单分类需要对输出结果做softmax操作,softmax操作其实就是把输出的多个类别通过运算缩放到0~1之间的值,我们可以称为概率值,然后对于每个物体预测的所有类别之和为1,具体可以参考这篇博文。再说回多分类,其实自然图片通常包括多个对象,那么就需要多标签分类。然后作者介绍了下他的做法:类似处理多任务问题,分别独立地预测每个类别。然后介绍了业界一般的做法:通过图神经网络利用标签相关性,改进损失函数、预训练方法和主干,在多标签分类领域取得了显著的成功。

极端分类时,我们需要预测大量类的存在(通常是数千或更多),迫使我们的模型和训练方案是高效和可扩展的。多标签零次学习(ZSL)是多标签分类的扩展,在推理过程中,网络尝试识别看不见的标签,即在训练过程中未使用的其他类别的标签。这通常是通过文本模型在可见类(用于训练)和不可见类之间共享知识来实现的。

分类网络通常包含主干和分类头。主干输出空间嵌入张量,分类头将空间嵌入张量转换为预测逻辑。在单标签分类中,这通常是通过全局平均池化 (GAP)完成的,然后是一个全连接层。基于GAP的分类头也用于多标签分类。然而,由于需要识别具有不同位置和大小的多个对象,这可能会使平均池的使用不是最优的。最近,一些研究提出了基于注意力分类头的多标签分类方法。有论文提出一种双流注意力框架,用于从全局图像到局部区域的多类别物体识别。还有论文提出了简单的空间注意分数,然后将其与类别无关的平均池化特征相结合。还有论文提出了一个具有可学习查询的池化transformer,用于多标签分类,获得了顶级结果。(具体哪篇论文请参考原文)

基于GAP的分类头简单而有效,并且由于它们具有固定的空间池化成本,因此可以很好地随类数量的增加而扩展。然而,它们提供了次优结果,并且不能直接应用于ZSL。基于注意力的分类头确实改善了结果,但通常成本很高,即使对于具有少量类别的数据集也是如此,并且对于极端的分类场景实际上是不可行的。它们也没有自然延伸到ZSL。

在本文中,我们介绍了一种新的分类头,称为ML-Decoder,它为单标签、多标签和零采样分类提供了统一的解决方案,并取得了最先进的结果(见图1)。ML-Decoder的设计基于原始的transformer-decoder,进行了两大修改,显著提高了其可扩展性和效率。首先,它通过去除冗余的自关注块,将解码器在输入查询数量上的二次依赖关系降低为线性依赖关系。其次,ML-Decoder使用一种新颖的组解码方案,它不是为每个类分配查询,而是使用固定数量的查询,这些查询通过称为组全连接(group
fully-connected)的新体系结构块插值到最终数量的类。使用组解码,ML-Decoder还享有固定的空间池成本,并且可以很好地扩展到数千个类。

在这里插入图片描述
ML-Decoder灵活高效。它可以用可学习的或固定的查询进行同样好的训练,并且可以在训练和推理期间使用不同的查询(见图2)。这些关键特性使ML-Decoder适合ZSL任务。当我们为每个类分配查询并使用单词查询训练MLdecoder时,它可以很好地泛化到看不见的查询,并显着改进了以前最先进的ZSL结果。我们还证明了组解码方案可以扩展到ZSL场景,并在训练过程中引入新的查询增强以进一步促进泛化。
在这里插入图片描述
本文的贡献可以总结如下:

  1. 我们提出了一种新的分类头,称为ML-Decoder,它为多标签、零标签和单标签分类提供了统一的解决方案,并具有最先进的结果。
  2. ML-Decoder可以作为全局平均池化的替代方案。它简单而高效,与更大的主干或其他基于注意力的头相比,它提供了更好的速度和精度权衡。
  3. ML-Decoder新颖的设计使其可扩展到分类数千类。互补的查询增强技术也提高了它对不可见类的通用性。
  4. 我们通过对常用分类数据集(MS-COCO、Open Images、NUS-WIDE、PASCAL-VOC和ImageNet)的综合实验验证了ML-Decoder的有效性。
  • 笔记:
    以上是翻译带一点补充,然后是Intro,是介绍关于分类、多分类各大家的做法,然后提出自己的做法,并且总结了下自己的贡献。比较关键的几点在最后的贡献也总结了,好像也没啥其他好写的了= =下面看具体的方法,方法我就不翻译了,直接带理解的做笔记。

2. 方法

先是回顾baseline分类头,包括 GAP-based 和 Attention-based。然后再介绍本文的重点ML-Decorder,包括他的优点以及介绍他在CV多重任务中什么适用的,多重任务当然就包括多标签分类、ZSL、单标签分类。

2.1 Baseline分类头

首先是统一一套框架,backbone+cls head的结构:
在这里插入图片描述
cls head又分为GAP-based和Attention-based,GAP-based就是用全局平均池化算子把backbone输出的tensort减到一维,然后全连接层转换为N个输出,N为类别,GAP通常处理单标签分类任务,有一定的泛化性,有些论文也把GAP作为多标签分类的baseline。
在这里插入图片描述

对于Attention-based的分类头,可以更好的使用空间数据,并提高结果,具体看下面。

2.2 回顾-Attention and Transformer-Decoder

这里回顾了transformer-decoder并且说明了ML-Decoder与之的区别。首先Attention的定义如下,Q、K、V分别为3个输入向量
在这里插入图片描述
多头的输出为:
在这里插入图片描述
在这里插入图片描述
图中展示了transformer-decoder和ML-Decoder的区别,FF是前馈全连接层。token池化阶段是在token嵌入的维度D上进行简单池化,以产生N个输出。

2.3 ML-Decoder

2.3.1 动机
transformer-decoder分类头有个缺点,计算成本是类别的平方。 导致类别越多,速度越慢,或者不可行。如Open Images(9600个类),从计算成本的角度来看,这类方法实际上是不可行的。另外,变压器-解码器作为分类头只适用于多标签分类。一个更普遍的基于注意力的头部,也可以处理其他任务,如单一标签和ZSL,将是有益的。

2.3.2 ML-Decoder设计
详细说明图3中,对于transformer-decoder,ML-Decoder做了哪些修改。

(1)移除Self-attention:

我们首先观察到,在推理过程中,transformer-decoder的self-attention模块对输入查询提供了固定的转换。然而,当查询进入cross-attention模块时,在进行注意操作之前,它们要经过一个投影层(参见公式1)。在实践中,投影层可以将查询转换为任何想要的输出,使自注意模块冗余。因此,我们可以去除自关注层,同时仍然保持分类头的相同表达性,并且不会降低结果。我们将在3.1节中验证这一点。通过消除自关注,我们避免了昂贵的模块,并将ML-Decoder在输入查询数上的二次方关系变为线性关系,使其更加实用和高效。

(2)组编码(Group-decoding)

在极端的分类场景中,即使分类头与类别数量的线性依赖关系也可能代价高昂。我们希望打破这种耦合,使交叉关注模块及其后的前馈层与类的数量无关,与GAP操作相同。为此,我们没有为每个类分配一个查询,而是使用固定数量的组查询K作为输入(参见图3)。

然后看图4,很明显只跟K有关而不跟N相关。
在这里插入图片描述
对组解码方案的一些额外观察和见解:

  • 使用全解码(g = 1),每个查询检查单个类的存在性。使用组解码,每个查询检查几个类的存在性。我们选择以随机的方式把班级分成几组。通过语义接近对类进行聚类是另一种选择,但需要一个繁琐的聚类过程,并且可能需要对每个数据集进行调优的额外超参数。在第3.2节中,我们将展示随机分组聚类足以提供与全解码方案相当的结果。
  • 在flops方面,组全连接层相当于基于gap的头部中的全连接层(N × D乘法)。两者在类的数量上都是线性相关的,但在实践中,即使对于数千个类,它们的计算开销也很小。就内存消耗而言,在单个操作中执行完全连接在一起的两个任务比连续执行它们更有效,因为不需要存储大型中间映射。
  • ML-Decoder中唯一依赖于输入图像大小的组件是cross-attention模块。我们可以把cross-attention层想象成空间池,类似于GAP。对于组解码,ML-Decoder具有固定的空间池开销,与N无关。

(3)Non-learnable查询

用于多标签分类的transformer-decoder只有在可学习的查询下才能获得最佳结果。然而,我们观察到查询总是被输入到一个多头注意层,该注意层对查询应用了一个可学习的投影计算(参见公式1)。因此,将查询权重设置为可学习的是多余的——可学习的投影可以将任何固定值查询转换为可学习查询获得的任何值。我们将在第3.1节中验证这一点,表明使用可学习或固定查询训练ML-Decoder时获得相同的准确性。除了简化训练过程之外,使用固定查询将使我们能够进行ZSL。

2.3.3 ML-Decoder for ZSL

接下来,我们将介绍在多标签ZSL场景中使用ML-Decoder所需的适应性,并讨论ML-Decoder的关键特性,使其适合该任务。我们还将证明组解码方案可以扩展到ZSL,并提出新的查询增强功能,进一步提高ML-Decoder的泛化性。

基于NLP的查询:我们首先介绍一个具有完整解码方案的ZSL ML-Decoder版本(每个标签都有一个相应的查询)。如前一节所讨论的,输入查询可以是可学习的,也可以是固定的。对于ZSL,我们使用固定的基于nlp的查询——对于每个标签,使用语言模型提取单词嵌入向量,并将其设置为输入查询。我们还在组全连接层中使用共享投影矩阵(在Eq. 3中设置Wk = W)。使用基于nlp的查询和共享投影矩阵,语义信息可以在推理期间从可见(训练)类传播到不可见(测试)类,从而实现泛化。

ML-Decoder功能:ML-Decoder包含几个有利的功能,使其非常适合ZSL。首先,它的注意机制是基于向量之间的点积相似度(Eq. 1)。由于NLP词嵌入保留了这种点积语义相似度[15],因此未见的标签更有可能与解码器内最相似的键和值匹配。此外,具有共享投影矩阵的MLDecoder允许可变数量的输入查询,并且对查询的顺序不敏感。这是有益的,因为在ZSL中,我们对不同的类集执行训练和测试,因此对不同的查询集执行训练和测试。对于ZSL,我们只对可见标签进行训练,并对不可见类进行推理,而对于广义ZSL (GZSL),我们对不可见和可见标签集的并集进行推理。

组解码:组解码(K < N)需要修改才能在ZSL设置中工作。在附录B中,我们详细介绍了ZSL组解码的变体。

查询增强:通过基于nlp的查询,MLDecoder自然地扩展到ZSL任务。然而,我们希望应用专门的训练技巧来进一步提高其通用性。在计算机视觉中,对输入图像进行增强以防止过拟合,并提高对未见过的新图像的泛化能力是一种常见的做法。
类似地,我们引入查询扩展来鼓励对不可见的类查询进行泛化。第一个增强是random-query,它向输入查询集添加额外的随机值查询,并为这些添加的查询分配一个表示“随机”的正基础真值标签。第二个增强是查询噪声,我们在每批输入查询中添加一个小的随机噪声。
请参见附录中的图8,以了解增强的示例。在第3.3节中,我们将展示查询增强鼓励模型识别以前没有遇到过的新查询向量,并提高ZSL分数。我们还尝试了查询截断增强,即每批删除查询的随机部分。然而,在我们的实验中,这种技术并不是有益的。

2.3.4 ML-Decoder for Single-label Classification
先前提出的大多数基于注意力的分类头都是用于多标签分类的,这也是我们在工作中关注的主要任务。然而,我们的ML-Decoder设计使其能够在其他计算机视觉任务(如单标签分类)中用作基于gap的磁头的直接替代品,如图2所示。

在多标签分类中,基于注意的头部的主要动机是需要识别几个不同位置和大小的物体。我们将在4.3节中展示ML-Decoder的好处更普遍,并且完全适用于单标签问题,其中图像通常包含单个对象。

3. 实验研究

在这部分,我们将为我们提出的ML-Decoder分类头带来消融测试和内部比较。首先,我们将使用不同类型的输入查询测试ML-Decoder。然后,我们将ML-Decoder与其他分类头进行比较,例如transformer-decoder和基于GAP的分类头。最后,我们将利用增强查询和群解码对ZSL进行消融研究。

3.1 查询类型比较

如第2.3.2节所述,由于注意模块中的线性投影,ML-Decoder在使用可学习或固定查询时保持相同的表达性。在表7中,我们比较了MS-COCO多标签数据集上不同类型查询的ML-Decoder结果(参见附录C以获得MS-COCO的完整训练细节)。

事实上,我们看到可学习的、固定随机的和固定基于NLP的单词查询都产生了相同的准确率,88.1% mAP,正如预期的那样。为了减少学习参数的数量,我们将使用固定查询。
在这里插入图片描述

3.2 比较不同分类头

在这里插入图片描述
在这里插入图片描述
TResNet-M 的backbone相当于Resnet50
在这里插入图片描述
在图5中,我们在MS-COCO上比较了mAP分数与基于gap和ML-Decoder分类头的失败,具有三种不同的架构- tresnet, TResNet-M, TResNet-L(在运行时相当于ResNet34, ResNet50和ResNet101)。

3.3 Zero-shot学习

在这里插入图片描述
从表中可以明显看出,随机查询和附加噪声都有助于模型泛化到不可见类的能力。当同时应用这两种方法时,我们看到未见过的课程的mAP分数增加了1.2%。我们还测试了查询增强对所见类的影响。在MS-COCO和NUS-WIDE上,添加查询扩展对所见类的mAP分数没有影响(MS-COCO为88.1%,NUS-WIDE为22.7%)。这与3.1节的结果一致,在3.1节中,可学习查询和固定查询在所见类上提供相同的结果。使用查询增强的好处是可以更好地泛化到不可见的类。

在表4中,我们比较了ZSL任务的组解码器和全解码器。附录B描述了对ZSL组解码方案的修改。
在这里插入图片描述
从表4中我们可以看到,组解码方案也适用于ZSL场景,与完全解码相比,mAP分数略有下降。

4. 实验结果

在本节中,我们将在流行的多标签、ZSL和单标签分类数据集上评估基于ml解码器的解决方案,并将结果与已知的最先进技术进行比较。

4.1 多标签分类

在这里插入图片描述

4.2 Zero-shot学习

在这里插入图片描述

4.3 单标签分类

在这里插入图片描述

5. 结论与未来工作

本文介绍了一种新的基于注意力的分类头——ML-Decoder。通过去除冗余的自关注层并使用新颖的组解码方案,ML-Decoder可以很好地扩展到数千个类,并且比使用更大的主干提供更好的速度-精度权衡。ML-Decoder可以很好地处理固定查询或随机查询,并在训练和推理时使用不同的查询。通过基于单词的查询和新颖的查询增强,ML-Decoder还可以很好地泛化到不可见的类。大量的实验分析表明,ML-Decoder优于基于GAP分类头的多个分类任务,如多标签,单标签和Zero-shot,并取得了新的最先进的结果。

我们未来的工作重点是将ML-Decoder的使用扩展到其他计算机视觉任务,包括分类,如目标检测和视频识别。我们还将探索更普遍地使用群解码方案来处理任何空间嵌入张量,并将尝试将其应用于其他领域和任务,如分割,姿态估计和NLP相关问题。

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

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

相关文章

Postman简单使用

文章目录 一.接口测试流程二、Postman接口测试工具三、接口关联四、全局变量和环境变量 一.接口测试流程 拿到API接口文档&#xff08;从开发拿或者抓包获取&#xff09;&#xff0c;熟悉接口业务&#xff0c;接口地址&#xff0c;错误码等等 编写接口的测试用例以及评审 编写…

1.SpringSecurity -快速入门、加密、基础授权

SpringSecurity简介 文章目录 SpringSecurity简介一、基本概念1.1 认证&#xff08;Authentication&#xff09;方式1.2 会话(Session)介绍1.3 授权(Authorization)介绍1.4 RBAC 二、SpringSecurity入门2.1 快速入门2.1.1 Maven坐标2.1.2 接口2.1.3 源码 2.2 配置文件配置用户名…

Bugku sql注入 基于布尔的SQL盲注 经典题where information过滤

目录 绕过空格 /**/绕过 ()绕过 回车绕过 &#xff08;键按钮&#xff09;绕过 等号绕过 绕过&#xff0c;&#xff08;逗号&#xff09;使用substr 下面存在基本绕过方式 注释符绕过 /**/绕过 #绕过 /*注释内容*/绕过 //注释绕过 大小写绕过 绕过information过…

14-k8s-基本存储之EmptyDir、HostPath、NFS

文章目录 一、相关概念二、EmptyDir存储三、HostPath存储四、NFS存储 一、相关概念 概述 Volumn定义在Pod上&#xff0c;然后被该Pod里面的多个容器挂载到具体的文件目录下。实现同一个Pod中不同容器之间的数据共享以及数据的持久化存储。Volume的生命周期不和Pod中的单个容器的…

MySQL逻辑架构

文章目录 逻辑架构剖析1. 连接层2. 服务层3. 引擎层4. 存储层 SQL执行流程1. MySQL中的 SQL执行流程&#xff08;理论&#xff09;2. MySQL8中的 SQL 执行流程&#xff08;实践&#xff09;确认profiling 是否开启多次执行相同SQL查询查看profiles查看profile 3. SQL语法顺序 数…

MFC-对话框

目录 1、模态和非模态对话框&#xff1a; &#xff08;1&#xff09;、对话框的创建 &#xff08;2&#xff09;、更改默认的对话框名称 &#xff08;3&#xff09;、创建模态对话框 1&#xff09;、创建按钮跳转的界面 2&#xff09;、在跳转的窗口添加类 3&#xff0…

Ceph 中的写入放大

新钛云服已累计为您分享769篇技术干货 介绍 Ceph 是一个开源的分布式存储系统&#xff0c;设计初衷是提供较好的性能、可靠性和可扩展性。 Ceph 独一无二地在一个统一的系统中同时提供了对象、块、和文件存储功能。 Ceph 消除了对系统单一中心节点的依赖&#xff0c;实现了无中…

Android自定义AppGlideModule,DataFetcher ,ModelLoaderFactory,ModelLoader,Kotlin(1)

Android自定义AppGlideModule,DataFetcher ,ModelLoaderFactory,ModelLoader,Kotlin(1) 假设实现一个简单的功能&#xff0c;对传入要加载的path路径增加一定的筛选、容错或“重定向”&#xff0c;需要自定义一个模型&#xff0c;基于这个模型&#xff0c;让Glide自动匹配模型…

C++前缀和算法:构造乘积矩阵

基础知识点 C算法&#xff1a;前缀和基础 题目 给你一个下标从 0 开始、大小为 n * m 的二维整数矩阵 grid &#xff0c;定义一个下标从 0 开始、大小为 n * m 的的二维矩阵 p。如果满足以下条件&#xff0c;则称 p 为 grid 的 乘积矩阵 &#xff1a; 对于每个元素 p[i][j] …

Redis HyperLogLog的使用

Redis HyperLogLog知识总结 一、简介二、使用 一、简介 Redis HyperLogLog是一种数据结构&#xff0c;用于高效地计算基数&#xff08;集合中唯一元素的数量&#xff09;。它的主要作用是用于在内存中高效地存储和计算大量数据的基数&#xff0c;而无需完全存储所有的数据。Hy…

CICD:Circle CI 实现CICD

持续集成解决什么问题 提高软件质量效率迭代便捷部署快速交付、便于管理 持续集成&#xff08;CI&#xff09; 集成&#xff0c;就是一些孤立的事物或元素通过某种方式集中在一起&#xff0c;产生联系&#xff0c;从而构建一个有机整体的过程。 持续&#xff0c;就是指长期…

BIM轻量化技术简介

BIM轻量化技术是指在工程建筑的BIM模型建立之后&#xff08;利用专业的BIM建模软件&#xff0c;比如Autodesk Revit, Bentley MicroStation, DS Catia等&#xff09;&#xff0c;通过对BIM模型的压缩处理等技术手段&#xff0c;让BIM可以在各类WEB浏览器、移动App上被使用的技术…

[架构之路-237]:目标系统 - 纵向分层 - 网络通信 - DNS的递归查询和迭代查询

目录 一、DNS协议与DNS系统架构 1.1 什么是DNS协议 1.2 为什么需要DNS协议 1.3 DNS系统架构 二、DNS系统的查询方式 2.1 递归与迭代的比较 2.2 DNS递归查询 2.3 DNS迭代查询 一、DNS协议与DNS系统架构 1.1 什么是DNS协议 DNS&#xff08;Domain Name System&#xff…

2.3 初探Hadoop世界

文章目录 零、学习目标一、导入新课二、新课讲解&#xff08;一&#xff09;Hadoop的前世今生1、Google处理大数据三大技术2、Hadoop如何诞生3、Hadoop主要发展历程 &#xff08;二&#xff09;Hadoop的优势1、扩容能力强2、成本低3、高效率4、可靠性5、高容错性 &#xff08;三…

数据分析案例-基于snownlp模型的MatePad11产品用户评论情感分析(文末送书)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

Android 14 正式发布,已经在 AOSP 中上线

本心、输入输出、结果 文章目录 Android 14 正式发布,已经在 AOSP 中上线前言总结主要更新内容机型支持优化性能的数据体现字体放大、多媒体支持加强Android 14 增加了对 10 位高动态范围 (HDR) 图像的支持提供了新的图形和尺寸管理用户体验 与隐私安全弘扬爱国精神Android 14…

nvm、node、npm解决问题过程记录

在Windows10如何降级Node.js版本&#xff1a;可以尝试将Node.js版本降级到一个较旧的版本&#xff0c;以查看问题是否得以解决。可以使用Node Version Manager (nvm) 来轻松切换Node.js版本&#xff0c;具体完整步骤&#xff1a; 首先&#xff0c;需要安装Node Version Manager…

leetcode-62.不同路径

1. 题目 2. 解答 dp[i][j]表示机器人位于第i&#xff0c;j位置的时候&#xff0c;有多少路径 如果i 0&#xff0c;dp[i][j] 1;如果j 0&#xff0c;dp[i][j] 1;其他情况dp[i][j] dp[i-1][j] dp[i][j - 1] #include <stdio.h>int solve(int m, int n) {int dp[m][…

【python海洋专题二十】subplots_adjust布局调整

上期读取soda&#xff0c;并subplot 但是存在一些不完美&#xff0c;本期修饰 本期内容 subplots_adjust布局调整 1&#xff1a;未调整布局的 2&#xff1a;调整布局 往期推荐 【python海洋专题一】查看数据nc文件的属性并输出属性到txt文件 【python海洋专题二】读取水深…

微信小程序框架---视图层逻辑层API事件

目录 前言 一、小程序框架介绍 1.响应的数据绑定 2.页面管理 3.基础组件 4.丰富的 API 二、视图层 View 1.WXML 数据绑定 列表渲染 条件渲染 模板 2.WXSS 尺寸单位 样式导入 内联样式 选择器 全局样式与局部样式 3.WXS 示例 注意事项 页面渲染 数据处理 …