《Visual Tree Convolutional Neural Network in Image Classification》阅读笔记

论文标题

《Visual Tree Convolutional Neural Network in Image Classification》

图像分类中的视觉树卷积神经网络

作者

Yuntao Liu、Yong Dou、Ruochun Jin 和 Peng Qiao

来自国防科技大学并行和分布式处理国家实验室

初读

摘要

  • 问题

    在图像分类领域,随着深度学习的快速发展,卷积神经网络(CNN)模型已经取得了高性能。然而,在图像数据集中,有些类别比其他类别更难区分。提高这些混淆类别的分类准确率对整体性能是有益的。

  • 方法

    在本文中,我们基于混淆的语义层次信息构建了一个混淆视觉树(Confusion Visual Tree,CVT),以识别这些混淆的类别。利用 CVT 提供的信息,我们可以引导 CNN 训练过程更多地关注这些混淆类别。因此,我们提出了基于我们 CVT 嵌入的原始深度 CNN 的可视化树卷积神经网络(VT-CNN)。

  • 性能

    我们在基准数据集 CIFAR-10 和 CIFAR-100 上评估了我们的 VT-CNN 模型。在我们的实验中,我们构建了 3 种不同的 VT-CNN 模型,它们相对于它们基于的 CNN 模型分别获得了 1.36 % 1.36\% 1.36% 0.89 % 0.89\% 0.89% 0.64 % 0.64\% 0.64% 的准确率提升。

结论

  • 在本文中,我们提出了一种可视化树卷积神经网络(Visual Tree Convolution Neural Network,VT-CNN),它将原始的 CNN 模型与视觉树连接起来。与原始 CNN 模型相比,VT-CNN 模型能够利用粗粒度类别分类中的先验信息来提升最终细粒度类别分类的性能
  • 我们还介绍了一种构建混淆视觉树(Confusion Visual Tree,CVT)的方法,为 VT-CNN 模型提供了一个更合理的树状结构。实验结果证实了我们的 VT-CNN 模型结合 CVT 相对于原始 CNN 模型的优势。
  • 未来的工作应该探讨对最终细粒度分类层的改进,例如将全类别 FC-softmax 层拆分为多个细粒度类别集的 FC-softmax 层。

再读

Section Ⅰ Introduction

  • 问题:易混淆的细粒度类别难以识别

    CNN 模型在图像分类任务中被广泛应用,其性能优于任何其他传统方法。尽管最先进的模型的分类准确率已经超过了人类,但 CNN 模型在区分视觉相似性高的类别方面仍面临挑战。我们知道,来自不同类别的某些实例很难区分。这些类别实例之间的误分类贡献了 CNN 模型的很大一部分错误率。以 ImageNet 数据集中的类别为例。我们考虑了一个粗粒度的类别集合“狗”,以及包含 120 种不同狗种的细粒度类别,如“巴仙吉犬”、“彭布罗克犬”和“柯基犬”。与粗粒度类别集合相比,每个集合中的细粒度类别存在强烈的视觉混淆。我们可以轻易区分两个粗粒度类别集合,比如“狗”和“战车”,但在“狗”集合中区分 120 种细粒度类别却很困难。

  • 这个问题有两个原因

    • 一个是 CNN 模型的结构可能是性能的局限,因结构可能不够深而无法达到更高的性能。
    • 另一个原因是指导 CNN 模型训练的策略并不适合图像分类任务中的细粒度类别分类
      • 在本文中,我们试图解决由后者原因造成的问题。
      • 原始的 CNN 模型会一次性输出数据集中所有类别的预测,这意味着模型实际上平等对待这些类别。因此,上述提到的混淆的细粒度类别使得原始 CNN 模型的区分能力遇到了瓶颈。
  • 现有解决方案:树结构

    • 一些基于树结构的传统方法被提出来解决由混淆类别引起的问题。这些传统方法将粗粒度类别放置在树结构的低层,而将细粒度类别放置在高层。
    • 一方面,这样做的好处是粗粒度类别容易区分,因此树分类器可以快速有效地完成这一分类任务。
    • 另一方面,树分类器主要关注不同的细粒度类别集合,这是分类任务中最困难的部分。
  • 改进或融合:

    • 受到树分类器方法的启发,我们也可以将 CNN 模型与树结构结合起来,以解决图像类别数量不平衡的问题。
    • 我们的想法是通过将基于数据集中类别构建的视觉树嵌入到原始 CNN 模型中来构建新的 CNN 模型。我们利用这个视觉树来指导 CNN 模型的训练。
    • 我们希望在进行细粒度类别分类时,CNN 模型主要关注一个样本的类别及其混淆类别。需要注意的是,我们可以从视觉树的高层细粒度类别中获取混淆的类别。
    • 与树分类器不同,我们的 CNN 模型应该输出数据集中所有类别的预测,而不是部分类别,这意味着我们的模型在关注一个样本的混淆类别的同时抑制其他类别。因此,我们可以利用视觉树中低层的粗粒度类别分类的输出来实现这一点。
  • 本文方法简介

    • 考虑到上述问题,

      • 我们首先应该构建一个视觉树结构,以便为 CNN 模型提供粗粒度类别和细粒度类别的分离。
      • 然后,我们应该调整原始 CNN 模型的结构,以适应图像分类任务中的细粒度混淆类别分类。
    • 在本文中,我们提出了一种新颖的方案,将视觉树结构与 CNN 模型结合起来,我们称之为可视化树卷积神经网络(Visual Tree Convolutional Neural Network,VT-CNN)

    • VT-CNN 模型的架构如图1(a)所示。

      在这里插入图片描述

      • 图片注解:四级混淆视觉树,其类别取自 CIFAR-100 数据集。
    • 构建 VT-CNN 模型包含两个主要步骤:

      • 第一步是为图像类别构建视觉树。
        • 受到CNN模型中混淆图概念的启发[3],我们提出使用社区层次检测算法来构建视觉树,称为混淆视觉树(Confusion Visual Tree,CVT)
        • 通过这种方法,我们可以自动构建视觉树结构,并充分利用 CNN 模型输出的信息。
      • 然后我们将这个树结构嵌入到 CNN 模型中。
        • 借鉴自[6]的思想,我们将 VT-CNN 模型的结构分为两部分:基础层分支层
          • 分支层包含多个分支,每个分支包含一系列层,如卷积层和全连接(FC)层。
          • 所有这些分支共享基础层。
          • 分支层的数量等于树模型中层级的数量减去根层,这意味着每个分支对应于一个层级细粒度类别的分类。
        • 通过使用[7]中提出的逐步训练方法,粗粒度类别分支会比细粒度类别分支更早进行训练,这可以在一定程度上防止梯度消失问题的影响,并提升 VT-CNN 模型的性能。

Section II RELATED WORK

  • 树模型构建的相关工作

    大量的研究工作集中在树模型的构建上:

    • 一些先前的研究利用语义本体(分类体系)来层次化地组织大量的图像类别。
    • 一些研究学习标签树和概率标签树,以便直接从大量数据集中学习视觉层次结构。
    • 同时,其他研究者提出了视觉树学习算法来层次化地组织大量图像类别,并使用层次化的多任务稀疏度量学习算法来学习增强的视觉树结构。
      • 这些方法使用了各种算法,如支持向量机(SVM)、聚类、混淆矩阵等。
      • 但这些算法的计算量很大,它们的性能在很大程度上依赖于它们所使用的算法底层的相似性特征描述能力。
  • 本文工作:

    • 与这些方法不同,我们的工作直接从 CNN 模型的输出中学习树结构
    • 在[3]中,通过使用深度模型中最后一层全连接(FC)层的输出来构建混淆图。首先,它将数据集中每张图像由最后一层 FC 层计算出的前 N 个得分添加到一个完整的图中。然后,在这个图上应用社区检测算法来生成该数据集的混淆图。
    • 受到这项工作的启发,我们将这个算法扩展为层次化的社区检测算法,以便我们可以直接从 CNN 模型的输出构建混淆视觉树(CVT)。
  • CNN + 树状结构的相关工作:

    CNN 模型已成功应用于许多计算机视觉任务,如图像分类。最近,有一些工作专注于将 CNN 模型的结构与树模型的结构联系起来。

    • 最早的尝试之一在[15]中报告,但其主要目标是在类别之间传递知识,以改善训练样本不足的类别的结果。
    • 在[16]中,提出的 HD-CNN 模型将类别层次结构嵌入到 CNN 模型中,使得模型使用粗粒度类别分类器分离简单类别,同时使用细粒度类别分类器区分困难类别。
      • **缺点:**然而,HD-CNN 模型需要对共享层进行预训练,并在细粒度类别组件上多次微调预训练模型,这非常复杂,
    • 在[6]中提出的分支卷积神经网络(B-CNN)模型,沿着对应于目标类别层次结构的连接卷积层输出从粗粒度到细粒度的多个预测,这可以被视为对输出的一种先验知识。
      • **缺点:**而且在 B-CNN 模型中,除了损失权重之外,粗粒度类别分支和细粒度类别分支之间没有紧密的联系。
  • 本文工作:

    • 与 HD-CNN 模型相比,我们的 VT-CNN 模型拥有更简单的网络结构,因此我们可以在不进行预训练模型微调的情况下训练 VT-CNN。
    • 为了紧密连接所有分支,我们在细粒度类别分支中使用了一种新的损失函数

Section III METHOD

A. Establish a Confusion Visual Tree

建立混淆视觉树

  • 构建 CVT 的总体步骤:

    本阶段的目标是为 VT-CNN 模型构建视觉树。VT-CNN 模型中的树结构 CVT 是通过以下三个步骤建立的:

    • 首先,使用混淆图生成算法计算混淆图及其权重
    • 其次,应用社区层次检测算法在混淆图中生成社区
    • 最后,利用第二步的结果来构建 CVT
  • 构建 CVT 的细节:

    • 我们对数据集 D D D 应用混淆图生成算法,为 CNN 模型 M M M 得到混淆图 G G G
    • 然后我们对 G G G 应用社区层次检测算法,得到社区集合 C C C
      • 请注意, C C C 有两个维度。一个维度指的是算法所有迭代输出的索引,另一个维度指的是每个输出中的社区。
      • 至于树 T = ( V , E , L ) T=(V,E,L) T=(V,E,L)
        • V V V 表示树中的节点,叶子代表类别,其他节点代表社区的符号,
        • E E E 表示连接 C C C 中较高层节点到较低层节点的边,
        • 其中前者节点( V V V)属于后者节点( E E E)所代表的社区集合,
        • L L L 是每个节点的标签集合,这些标签可以通过节点对应的社区集合生成。
  • 我们特别针对 CIFAR-10 数据集详细阐述了 CVT 的构建过程,如图2所示。左侧展示了混淆图及其内部的社区,右侧则是 CVT。

    在这里插入图片描述

    • 左侧分为四个步骤:初始步骤和迭代步骤1至3。
    • 我们使用混淆图生成函数在初始步骤生成一个混淆图。
      • 图中的每个顶点代表数据集中的一个类别,每条边的权重量化了两个相连类别之间的混淆程度。
    • 然后我们对混淆图应用社区层次检测函数,在该函数的每次迭代中我们都会得到一个社区图。
      • 例如,在迭代步骤1中,我们得到了五个细粒度社区,我们在“level3”的树中设置了五个节点,这些节点一一对应于这些社区。每个社区的成员代表一个特定的类别。然后我们将叶子节点链接到 level3 的节点。例如,我们将节点 “cat” 和节点 “dog” 链接到 level3 的 “Small-mammals” 节点。我们重复这个过程,直到 level2 的节点链接到 level1 的根节点,然后完成构建过程。

B. VT-CNN Architecture

VT-CNN 架构

在本节中,我们将 CVT 嵌入到原始 CNN 模型中构建 VT-CNN 模型。

  • 架构图

    • 以 CIFAR-100 上的分类任务为例,VT-CNN 模型的架构如图1(a) 所示,CIFAR-100 的 4 级 CVT 如图1(b) 所示。

      在这里插入图片描述

    • VT-CNN 模型的目标是区分树结构叶子上呈现的细粒度类别,这些是分类任务的最终目标。

    • 对于树结构,我们使用 level-n 来指代视觉树的第 n 层。我们定义 level-1 为根节点,而 level-N 指的是有 N 层的树的叶子。

  • 基于CNN 构建 VT-CNN

    • VT-CNN 模型基于现有的 CNN 模型构建。它有两个重要的组成部分。一个是主干层,我们称之为基础架构。另一个是分支层,我们称之为分支架构。
      • 基础架构实际上是从原始 CNN 模型如 AlexNet 模型和 VGG-Verydeep16(VGG16)模型借用的,其中的所有层都被所有分支共享。
      • 分支架构与视觉树的不同层级相关。每个分支的架构包含两个卷积网络(ConvNets)和两个全连接(FC)层,每个分支与其在树架构中相关层级的区别任务相关联。分支架构中的层数等于视觉树中层级的数量减去根层。
    • 遵循[6],CNN 模型中的低层通常捕捉图像的低级特征,如基本形状,而高层则更有可能提取高级特征,如狗的脸部。
    • 类似地,树架构中的粗粒度类别与上述低级特征相关联,而叶子上的细粒度类别与高级特征相关联。因此,从 CNN 模型的低层延伸出的分支层与树架构的低层相关联,而高层与树架构的高层相关联
  • VT-CNN 的特点

    • VT-CNN 模型的树状结构为高层的最后分支中的细粒度类别分类提供了低层分支中包含的先验信息。这种好处来自于这样一个概念:树结构叶子上的关键信息,即细粒度分类的关键,实际上包含在它们的祖先节点中,这些祖先节点负责粗粒度分类。
    • 因此,我们的 VT-CNN 模型专注于同一社区中的细粒度类别,而不是像原始 CNN 模型那样平等对待所有类别。这是与原始 CNN 模型的不同之处。

C. VT-CNN Training

我们的 VT-CNN 模型的理念是:粗粒度类别分类的先验信息应用于细粒度类别的分类。因此,我们将 VT-CNN 的训练分为三个步骤:建立CVT、训练粗粒度分支和训练细粒度分支

  1. 为特定 CNN 模型建立混淆视觉树(CVT):我们首先为用作 VT-CNN 模型基础的 CNN 模型建立 CVT。

    • 首先,我们在特定数据集上训练原始 CNN 模型,得到其对数据集中每类图像的输出分数。
    • 然后,我们使用第三节A部分中的算法,基于这些输出来建立 CVT。
  2. 训练数据:为了训练VT-CNN模型,原始数据集需要进行一些修改。

  • 每张图片应该有几个标签,这些标签应与基于第三节C1中构建的CVT的粗粒度和细粒度类别划分保持一致。标签的数量等于VT-CNN模型中的分支数量。以 CIFAR-10 数据集中标签为“狗”的图片为例,根据上述规则,该图片应有三个标签:“动物”、“小型哺乳动物”和“狗”。
  1. 训练粗粒度分支:除了与细粒度类别分类相关的最后一个分支之外,所有分支都在这一步进行训练。我们直接给出损失函数。VT-CNN 模型训练中的损失函数包含了所有粗粒度分支的损失函数。损失函数定义为:
    L C = − 1 n ∑ i = 1 n ∑ k = 1 K − 1 W k log ⁡ ( e c y i k ∑ j e c j k ) L_C=-\frac{1}{n}\sum^n_{i=1}\sum^{K-1}_{k=1}W_k\log\left(\frac{e^{c^k_{y_i}}}{\sum_je^{c^k_j}}\right) LC=n1i=1nk=1K1Wklog(jecjkecyik)
  • 参数字典:
    • i i i 表示小批量中的第 i i i 个样本,
    • K K K 是 VT-CNN 模型中所有分支的数量,
    • W k W_k Wk 是第 k k k 个分支对损失函数的贡献权重,
    • c j c_j cj 表示类别得分向量 c c c 的第 j j j 个元素。

请注意,在这一部分我们不需要考虑最后一个分支,所以分支的数量是从 k = 1 k=1 k=1 k = K − 1 k=K-1 k=K1。这个损失函数 L C L_C LC 计算了这些分支上的 softmax 交叉熵,并将它们相加。

  1. 训练细粒度分支:在粗粒度分支得到适当训练后,我们开始训练细粒度分支,这也是 VT-CNN 模型的最后一个分支。在概率平均层,我们改变了最终预测,将其变为一个加权平均预测,该预测是从 ( K − 1 ) (K-1) (K1) 层粗粒度分支计算得出的,如下所示:
    f i = c t ( i ) K − 1 f i K ∑ j c t ( j ) K − 1 f j K f_i=\frac{c^{K-1}_{t(i)}f_i^K}{\sum_jc^{K-1}_{t(j)}f_j^K} fi=jct(j)K1fjKct(i)K1fiK

    • 参数字典:
      • t t t 是细粒度类别到 ( K − 1 ) (K-1) (K1) 层粗粒度类别集合的映射,
      • t ( i ) t(i) t(i) 表示细粒度类别i相关的粗粒度类别。

    细粒度分支的损失函数定义为:
    L F = − 1 n ∑ i = 1 n W K log ⁡ ( e f y i ∑ j e f j ) L_F=-\frac{1}{n}\sum^n_{i=1}W_K\log\left(\frac{e^{f_{y_i}}}{\sum_je^{f_j}}\right) LF=n1i=1nWKlog(jefjefyi)
    在训练过程中,我们改变权重 W k W_k Wk 来控制将要训练的分支。在我们的训练策略中,我们首先希望训练粗粒度分支,所以我们首先设置 ∑ K − 1 k = 1 W k = 1 ∑^{k=1}_{K-1}W_k=1 K1k=1Wk=1 W K = 0 W_K = 0 WK=0。然后我们训练细粒度分支,并设置 ∑ K − 1 k = 1 W k = 0 ∑^{k=1}_{K-1}W_k=0 K1k=1Wk=0 W K = 1 W_K = 1 WK=1。最后,我们完成训练过程。

Section IV EXPERIMENT

A. Datasets and Experiment Settings

数据集和实验设置

  • 为了全面评估我们提出的方法,我们在实验中使用了以下两个图像数据集: CIFAR-10 和 CIFAR-100
    • CIFAR-10 是一个用于通用物体识别的数据集,包含10个类别。每张图片都是 32 × 32 32\times32 32×32 像素的自然 RGB 图像,数据集总共有 60,000 张图片,其中 50,000 张用于训练,10,000 张用于测试。
    • CIFAR-100 数据集包含 60,000 张图片和 100 个类别。每张图片也是 32×32 像素的自然 RGB 图像,每个类别有 600 张图片,其中 500 张用于训练,100 张用于评估。我们在这两个数据集上的实验遵循它们的这种划分。
  • 我们使用 Top-1 平均准确率(%)作为评估所有这些方法性能的标准。所有实验都是在配备有 Intel Core i7 处理器、32GB 内存和 NVIDIA GeForce GTX 1080 Ti 显卡的个人电脑上进行的。

B. CIFAR-10

在 CIFAR-10 数据集上进行的实验将 VT-CNN 模型与基本模型和 B-CNN 模型进行了比较。

  • 基线模型:我们构建了两个基线模型。

    • Base A 模型实际上是 AlexNet 模型,它们之间的微小区别在于 Base A 模型中第一和第二卷积层的滤波器大小被调整为 5 × 5 5\times5 5×5
    • Base B 模型是 VGG16 模型,但没有最后的池化层,因为 CIFAR 数据集中的图像非常小。
  • 具体配置:然后我们基于这些基线模型构建了 VT-CNN 模型。在 CIFAR-10 数据集中,我们的 CVT 模型有 4 个层次,因此在 VT-CNN 模型中有 3 个分支。具体的配置如表I所示:

    在这里插入图片描述

  • 参数设置:我们在 CIFAR-10 数据集上评估了我们的 VT-CNN 模型、它们的基线模型以及 B-CNN 模型。请注意,B-CNN 模型的树结构与我们的 VT-CNN 模型相同。

    • 对于模型A,两种模型的学习率都初始化为 0.003,在 40 个周期后降至 0.0005,在 50 个周期后降至 0.0001。
    • 对于模型 B,我们在 ImageNet 数据集上对预训练的 VGG16 模型进行微调,学习率的配置与模型 A 相同。在粗粒度分支的训练步骤中,我们设置了相同的损失权重。
  • 结果

    结果如表 II 所示

    在这里插入图片描述

    • 基线模型 A 的准确率为 82.94%,B-CNN模型达到了84.70%。我们的 VT-CNN 模型以 85.07% 的准确率超过了 B-CNN 模型。
    • 基线模型B的准确率为 87.15%,而 B-CNN 模型达到了 88.23%。我们的 VT-CNN 模型达到了 89.51%。
    • 这种提升是显而易见的,表明我们的 VT-CNN 模型在 CIFAR-10 数据集上的性能优于原始 CNN 模型和 B-CNN模型。

C. CIFAR-100

在本节中,我们在 CIFAR-100 数据集上评估我们的 VT-CNN 模型。实验分为两部分。一部分是将 VT-CNN 模型与基于这3个原始 CNN 模型的基线模型以及基于这些基线模型的 B-CNN 模型进行比较。另一部分是对比构建在不同视觉树结构上的 VT-CNN 模型。

  • 基线模型

    • 首先,我们介绍了3个原始的 CNN 模型,分别是 AlexNet、VGG16 和 ResNet-56。

      • 在 CIFAR-100 数据集上,AlexNet 模型和 VGG16 模型的配置与第四节B部分中的 Base A 模型和 Base B 模型相同。
      • ResNet-56 是一个深度为 56 的残差学习网络,使用 2个卷积层的残差块构建。
    • 我们基于这些基线模型构建了 VT-CNN 模型。

      • 它们的分支架构配置与第四节B部分中的配置相似,因为 VT-CNN 模型的主要思想是分支应该连接到基础层的不同位置。
      • 有一点不同的是,我们在 CIFAR-100 数据集上的 CVT有5层,因此在VT-CNN模型中有4个分支。
  • 参数设置:这 3 个基线模型及其衍生的 B-CNN 和 VT-CNN 模型在 80 个周期内进行训练,并在不同周期使用不同的学习率。学习率初始化为0.001,在第55个周期后降至0.0002,在第70个周期后降至0.00005。

  • 结果

    • 完整的实验结果在表III中给出

      在这里插入图片描述

    • 在每种情况下,我们的 VT-CNN 模型都比相应的基线模型和衍生的 B-CNN 模型达到了最高的准确率。

      • 在 AlexNet 的情况下,与基线模型相比相对提升为 1.36%,
      • 与 B-CNN 模型相比为 0.46%。
      • 我们使用 VGG16 模型作为基线模型来训练 VT-CNN 模型。VGG16 模型给出 71.15%的准确率,衍生的 B-CNN 模型给出71.23%,而我们达到了72.04%。
      • 最后,我们考虑了最先进的技术 ResNet 作为基线模型,并使用了 ResNet-56 模型。我们基于 ResNet-56 模型构建的 VT-CNN 模型取得了 74.13% 的准确率,这是本次实验中的最佳结果,而 ResNet-56 模型达到了 73.49%,B-CNN 模型达到了 73.86%。我们发现,与原始 CNN 模型及其衍生的 B-CNN 模型相比,我们的 VT-CNN 模型在 CIFAR-100 数据集上的分类任务中取得了最佳性能。
  • 不同视觉树结构对比

    • 然后我们进行了基于不同视觉树结构构建的 VT-CNN 模型的比较实验。选择以下竞争树结构进行比较:语义本体、标签树、视觉树以及最先进的技术增强视觉树。

    • 基于这些结构的所有 VT-CNN 模型的分类性能在表IV中报告

      在这里插入图片描述

    • 结果:

      • 观察表IV,我们发现语义本体的性能最差,因为它的树结构是基于语义空间构建的,而图像分类过程是基于特征空间。
      • 对于另外四种基于特征空间的方法,标签树的性能较差,因为它使用 OvR 分类器构建其树结构,这受到样本不平衡和分类器性能的限制。
      • 至于视觉树,它直接从数据集中提取平均特征。增强视觉树采用了谱聚类方法,更好地反映了类别的多样性,因此其性能优于视觉树。我们的CVT基于神经网络的混淆构建树结构,尽可能使兄弟节点与父节点尽可能接近。因此,CVT 的结构更为合适,我们在视觉树和增强视觉树上取得了显著的提升,分别提高了4.65%和1.99%。

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

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

相关文章

JCL中常用的DD语句

JCL中的DD语句介绍 ​ DD语句,主要定义数据集用的,也叫做DATASET DEFINE,分为定义设备的UNIT、VOLUME、SPACE,定义数据集的DSN、DISP、DCB,详细可以看英文版的《MVS JCL Reference》,还有一些特殊的DD,暂时…

hdu1195 Open the lock 双向广度优先搜索

D-BFS 双向广度优先搜索 从起点和终点同时开始搜索&#xff0c;直到两个搜索的点相交&#xff0c;得到最短路径 Code: // D-BFS //by:MuQY #include <iostream> #include <algorithm> #include <string.h> #include <queue> #include <string> …

redis + 拦截器 :防止数据重复提交

1.项目用到,不是核心 我们干系统开发,不免要考虑一个点&#xff0c;数据的重复提交。 我想我们之前如果要校验数据重复提交要求&#xff0c;会怎么干?会在业务层&#xff0c;对数据库操作&#xff0c;查询数据是否存在,存在就禁止插入数据; 但是吧,我们每次crud操作都会连接…

Conda 使用environment.yml创建一个新的Python项目

Conda系列&#xff1a; 翻译: Anaconda 与 miniconda的区别Miniconda介绍以及安装Conda python运行的包和环境管理 入门Conda python管理环境environments 一 从入门到精通Conda python管理环境environments 二 从入门到精通Conda python管理环境environments 三 从入门到精通…

luceda ipkiss教程 58:输出器件的版图和三维模型

在ipkiss中&#xff0c;通过visualize_3d_povray可以输出包含器件的三维模型参数的.pov文件&#xff0c;再通过POV-Ray&#xff08;免费软件&#xff0c;下载地址&#xff1a;https://www.povray.org/download/&#xff09;就可以查看器件的三维模型。 如&#xff1a; 代码如…

账号定位基础

1.账号定位流程 定位体系 &#xff08;1&#xff09;商业定位 ①商业定位-带货 ②商业定位-引流 ③商业定位-接广告 ④商业定位-直播打赏 &#xff08;2&#xff09;内容定位 内容定位分为&#xff1a;主题IP、人物IP &#xff08;2-1&#xff09;主题IP ①有用处 ②有兴…

144基于matlab的平面桁架结构的总体刚度矩阵计算

基于matlab的平面桁架结构的总体刚度矩阵计算&#xff0c;最后以图形形式显示出桁架结构&#xff0c;程序已调通&#xff0c;可直接运行。 144matlab 平面桁架 有限元分析 总体刚度 (xiaohongshu.com)

0125-2-Vue深入学习1—mustache模板引擎原理

[mustache] 是 “胡子”的意思&#xff0c;因为它的嵌入标记 {{ }} 旋转过来很像[胡子]&#xff0c;Vue中的 {{ }} 语法也引用了mustache&#xff0c;这也是我深入学习的目的。 1、原始js方式使 数据 变为视图 <ul id"list"></ul><script>var arr …

Git常用命令介绍

Git 是一个开源的分布式版本控制系统&#xff0c;用于敏捷高效地处理任何或小或大的项目 一、Git的安装 安装包下载地址&#xff1a;https://gitforwindows.org/ 国内的镜像地址&#xff1a;https://npm.taobao.org/mirrors/git-for-windows/ 完成安装之后&#xff0c;在开…

面试常问的Spring AOP底层原理

AOP底层原理可以划分成四个阶段&#xff1a;创建代理对象阶段、拦截目标对象阶段、调用代理对象阶段、调用目标对象阶段 第一阶段&#xff1a;创建代理对象阶段 通过getBean&#xff08;&#xff09;方法创建Bean实例根据AOP的配置匹配目标类的类名&#xff0c;判断是否满足切…

wfuzz网站模糊测试

https://github.com/xmendez/wfuzz Wfuzz: The Web fuzzer — Wfuzz 2.1.4 documentatio n 一、wfuzz介绍 WFuzz是基于Python开发的 Web安全模糊测试工具。可以将其理解为Fuzz一款暴力破解工具。根据用户提供的字典&#xff0c;获取web站点的敏感目录和信息。 Wfuzz 提供了一个…

小程序样例3:根据日历创建待办事项

基本功能 1、待办事项查看 选择不同的日期显示不同的待办: 2、选择日期后 新增事项&#xff1a; 3. 点击事项&#xff0c;查看详情 4、删除事项&#xff1a;删除事项3之后&#xff0c;剩余事项2 5、点击日期可以选择更多的月&#xff1a; 实现思路&#xff1a; 1、数据结构&a…

开始学习Vue2(axios和Vuex)

一、Axios 1、Axios 简介 Axios 是一个基于 promise 网络请求库 &#xff0c;作用于node.j s 和浏 览器中。它是 isomorphic 的(即同一套代码可以运行在浏览器 和 node.js 中)。在服务端它使用原生 node.js http 模块, 而在 客户端 (浏览端) 则使用 XMLHttpRequests。 …

通俗易懂理解SegNet语义分割模型

重要说明&#xff1a;本文从网上资料整理而来&#xff0c;仅记录博主学习相关知识点的过程&#xff0c;侵删。 一、参考资料 深度学习之图像分割—— SegNet基本思想和网络结构以及论文补充 一文带你读懂 SegNet&#xff08;语义分割&#xff09; 二、相关介绍 1. 上采样(…

关于爬虫爬取网页时遇到的乱码问题的解决方案。

目录 前言解决措施 前言 最近&#xff0c;我像爬取一下三国演义这本书籍的全部内容。 网站的网址为&#xff1a;https://www.shicimingju.com/book/sanguoyanyi.html 但是我爬取出来的结果是这样的 会遇到乱码。 经过我多方面的调试发现&#xff0c;就是网页的编码和我pycha…

mysql8版本批量造4000个数据SQL

需求&#xff1a; 测试工作中修改单需要构造单元下4000个组合的数据&#xff0c;写个博客来记录&#xff0c;其他类似的可以举一反三。 具体sql&#xff1a; 实现1个产品1个单元下插入4000个组合数据 思路&#xff1a; 在MySQL 8中实现循环插入4000条具有不同主键的记录&a…

jquery多选框

使用hbuilder <!DOCTYPE html> <html><head><meta charset"GBK"><title></title></head><body><table id"myTable"> <tr> <td>黄1</td> </tr> <tr> <td>…

echarts 玫瑰饼图 俩个共用一个图例 可同时改变

export const getRosePie (option {}) > {return {legend: {textStyle: {color: #B0D0E9}},tooltip: {},dataset: {// source: [// [flag, 已解决, 未解决],// [设备告警, 86, 10],// [环境告警, 41, 30],// [任务告警, 24, 67]// ]source: option.source},series…

【Web前端实操15】利用Grid布局完成九宫格

相关知识点&#xff1a; 创建多列 column-count 属性指定了需要分割的列数 列与列之间的间隙 column-gap 属性指定了列与列间的间隙 列边框 column-rule-style 属性指定了列与列间的边框样式 column-rule-width 属性指定了两列的边框厚度 column-rule-color 属性指定了…

如何在 Kotlin Multiplatform 库的 API 中避免请求 Android Context

如何在 Kotlin Multiplatform 库的 API 中避免请求 Android Context 假设你正在进行 Kotlin Multiplatform 项目的开发。 你需要从通用代码中获取用户的 GPS 位置&#xff0c;并且目前没有现成的库可以实现该功能。 这时&#xff0c;你决定编写一个新的 Kotlin Multiplatform …