-
1. KNN算法原理KNN算法是选择与输入样本在特征空间内最近邻的k个训练样本并根据一定的决策规则,给出输出结果 。决策规则:分类任务:输出结果为k个训练样本中占大多数的类 。回归任务:输出结果为k个训练样本值的平均值 。如下图的分类任务,输出结果为w1类 。KNN算法优缺点优点:1)算法简单,理论成熟,可用于分类和回归。2)对异常值不敏感。3)可用于非线性分类。4)比较适用于容量较大的训练数据,容量较小的训练数据则很容易出现误分类情况。5)KNN算法原理是根据邻域的K个样本来确定输出类别,因此对于不同类的样本集有交叉或重叠较多的待分样本集来说,KNN方法较其他方法更为合适。缺点:1)时间复杂度和空间复杂度高。2)训练样本不平衡,对稀有类别的预测准确率低。3)相比决策树模型,KNN模型可解释性不强。文章来源于机器学习算法那些事 ,作者石头
-
作为基础特征提取器,视觉骨干(vision backbone)是计算机视觉领域的基础研究课题。得益于卓越的特征提取性能,CNN 成为过去十年中不可或缺的研究课题。在 AlexNet 重新开启深度学习十年之后,通过使用更深的网络、更高效的架构、更强的多尺度能力,社区已取得多项突破以获得更强大的视觉骨干和注意力机制。由于平移不变性和共享滑动窗口策略,CNN 对于具有任意大小输入的各种视觉任务是有效的。更先进的视觉骨干网络通常会在各种任务中带来显著性能提升,包括图像分类、对象检测、语义分割和姿势估计。同时,选择性注意力是处理视觉中复杂搜索组合的重要机制。注意力机制可以看作是基于输入特征的自适应选择过程。自从提出完全注意力网络以来,自注意力模型(即 Transformer)迅速成为了 NLP 领域的主导架构。近年来,Dosovitskiy 等人提出 ViT,它将 transformer 骨干引入计算机视觉,并在图像分类任务上优于 CNN。得益于强大的建模能力,基于 transformer 的视觉骨干迅速占领了各种任务的排行榜,包括对象检测和语义分割等。尽管自注意力机制最初是为 NLP 任务而设计的,但近来已经席卷了计算机视觉领域。然而,图像的 2D 特性为在计算机视觉中应用自注意力带来了三个挑战:将图像视为一维序列会忽略它们的二维结构;二次复杂度对于高分辨率图像来说太昂贵了;只捕捉空间适应性而忽略通道适应性。近日,来自清华大学胡事民团队和南开大学程明明团队提出了一种新型大核注意力(large kernel attention,LKA)模块,在避免上述问题的同时实现了自注意力中的自适应和长距离相关性。该研究还进一步提出了一种基于 LKA 的新型神经网络,命名为视觉注意力网络(VAN)。在图像分类、目标检测、语义分割、实例分割等广泛的实验中,VAN 的性能优于 SOTA 视觉 transformer 和卷积神经网络。论文一作为清华大学计算机系博士生国孟昊,主要研究方向为计算机视觉、计算机图形学、深度学习。他也是计图的开发者之一,曾在国际会议 / 期刊 ICLR/IPMI/CVMJ 上发表论文。胡事民,清华大学计算机科学与技术系教授,主要从事计算机图形学、智能信息处理和系统软件等方面的研究。研制并开源了第一个我国高校自主的深度学习框架——计图(Jittor),计图是一个完全动态编译(Just-in-time),基于元算子融合和统一计算图的深度学习框架。计图支持 30 多种的骨干网络,并且开源了多个模型库:对抗生成网络、图像语义分割、检测与实例分割、点云分类、可微渲染等。程明明,南开大学教授,计算机系主任,他的主要研究方向是计算机视觉和计算机图形学,他发表的论文谷歌引用 2 万余次,单篇最高引用 4000 余次。方法大核注意力注意力机制可以看作是一个自适应选择的过程,它可以根据输入特征选择鉴别特征并自动忽略噪声响应。注意力机制的关键步骤是生成注意力图,指出不同点的重要性。因此需要了解各点之间的关系。有两种众所周知的方法可以在不同点之间建立关系。第一种是采用自注意力机制来捕获长距离依赖。第二种是使用大核卷积来建立相关性并产生注意力图,这种方式还是有明显的弊端的,大核卷积带来了大量的计算开销和参数。为了克服上述缺点并利用自注意力和大核卷积的优点,该研究提出分解大核卷积操作来捕获长距离关系。如下图 2 所示,大核卷积可以分为三个部分:空间局部卷积(depth-wise 卷积)、空间长距离卷积(depth-wise 空洞卷积)和通道卷积(1×1 卷积)。视觉注意力网络(VAN) VAN 具有简单的层次结构,包括四个阶段,并逐步降低输出空间分辨率,即 H/4 × W/4 、H/8 × W/8 、H/16 × W/16 和 H /32 × W/32 。其中,H 和 W 代表输入图像的高度和宽度。随着分辨率的降低,输出通道的数量也在增加。输出通道 C_i 的变化如.该研究首先对输入进行下采样,并使用步幅数来控制下采样率。该研究通过定量和定性实验来证明 VAN 的有效性。其中,在 ImageNet-1K 图像分类数据集、COCO 目标检测数据集和 ADE20K 语义分割数据集上进行了定量实验,并在 ImageNet 验证集上使用 Grad-CAM 来可视化类激活映射(CAM)。该研究首先用消融实验证明 LKA 的每个组成部分都是至关重要的。为了快速获得实验结果,该研究选择 VAN-Tiny 作为基线模型通过以上分析,研究者发现 LKA 可以利用局部信息,捕捉长距离依赖,在通道和空间维度上都具有适应性。此外,实验结果证明 LKA 的所有组成部分都有助于完成识别任务。虽然标准卷积可以充分利用局部语境信息,但它忽略了长距离依赖和适应性。而自注意力虽然可以捕获长距离依赖,且在空间维度上具有适应性,但它忽略了局部信息和在通道维度上的适应性。研究者还将 VAN 与现有方法进行了比较,包括 MLP、CNN 和 ViT,结果如下表 5 所示。在相似的参数和计算成本下,VAN 优于常见的 CNN(ResNet、ResNeXt、ConvNeXt 等)、ViT(DeiT、PVT 和 Swin-Transformer 等)和 MLP(MLP -Mixer、ResMLP、gMLP 等)。可视化类激活映射(CAM)是一种可视化鉴别区域(注意力图)的流行工具。该研究采用 Grad-CAM 来可视化 ImageNet 验证集上由 VAN-Base 模型生成的注意力。下图 4 的结果表明,VAN-Base 可以清晰地聚焦在目标对象上,可视化直观地证明了 VAN 的有效性。
-
深度神经网络是由多个单层非线性网络叠加而成的,常见的单层网络按照编码解码情况分为3类:只包含编码器部分、只包含解码器部分、既有编码器部分也有解码器部分。编码器提供从输入到隐含特征空间的自底向上的映射,解码器以重建结果尽可能接近原始输入为目标将隐含特征映射到输入空间。 人的视觉系统对信息的处理是分级的。从低级的提取边缘特征到形状(或者目标等),再到更高层的目标、目标的行为等,即底层特征组合成了高层特征,由低到高的特征表示越来越抽象。深度学习借鉴的这个过程就是建模的过程。 深度神经网络可以分为3类,前馈深度网络(feed-forwarddeep networks, FFDN),由多个编码器层叠加而成,如多层感知机(multi-layer perceptrons, MLP)、卷积神经网络(convolutionalneural networks, CNN)等。反馈深度网络(feed-back deep networks, FBDN),由多个解码器层叠加而成,如反卷积网络(deconvolutionalnetworks, DN)、层次稀疏编码网络(hierarchical sparse coding, HSC)等。双向深度网络(bi-directionaldeep networks, BDDN),通过叠加多个编码器层和解码器层构成(每层可能是单独的编码过程或解码过程,也可能既包含编码过程也包含解码过程),如深度玻尔兹曼机(deep Boltzmann machines, DBM)、深度信念网络(deep beliefnetworks, DBN)、栈式自编码器(stacked auto-encoders, SAE)等。深度神经网络是由多个单层非线性网络叠加而成的,常见的单层网络按照编码解码情况分为3类:只包含编码器部分、只包含解码器部分、既有编码器部分也有解码器部分。编码器提供从输入到隐含特征空间的自底向上的映射,解码器以重建结果尽可能接近原始输入为目标将隐含特征映射到输入空间。
-
Dropout启发其他以随机方法训练指数量级的共享权重的集成。DropConnect是Dropout的一个特殊情况,其中一个标量权重和单个隐藏单元状态之间的每个乘积被认为是可以丢弃的一个单元 (Wan et al., 2013)。随机池化是构造卷积神经网络集成的一种随机池化的形式 (见第 9.3 节),其中每个卷积网络参与每个特征图的不同空间位置。目前为止,Dropout仍然是最广泛使用的隐式集成方法。一个关于Dropout的重要见解是,通过随机行为训练网络并平均多个随机决定进行预测,实现了一种参数共享的Bagging形式。早些时候,我们将Dropout描述为通过包括或排除单元形成模型集成的Bagging。然而,这种参数共享策略不一定要基于包括和排除。原则上,任何一种随机的修改都是可接受的。在实践中,我们必须选择让神经网络能够学习对抗的修改类型。在理想情况下,我们也应该使用可以快速近似推断的模型族。我们可以认为由向量 µ 参数化的任何形式的修改,是对 µ 所有可能的值训练 p(y | x, µ) 的集成。注意,这里不要求 µ 具有有限数量的值。例如, µ 可以是实值。Srivastava et al. (2014) 表明,权重乘以 µ ∼ N (1, I) 比基于二值掩码Dropout表现得更好。由于 E[µ] = 1,标准网络自动实现集成的近似推断,而不需要权重比例推断规则。
-
作者:机器之心编译要使神经网络能够更好地记忆数据,它们需要的参数比想象的要多得多。传统上,只要参数的数量大于要满足的方程数量,我们就可以使用参数化模型来进行数据插值。但在深度学习中,一个令人困惑的现象是,模型训练使用的参数数量比这个经典理论所建议的要多得多。深度学习中经常会出现各种大型的神经网络,神经网络是执行类人任务的领先 AI 系统。随着它们参数的增多,神经网络已经可以执行各种任务。按照数学的理论,神经网络无需很大就能执行任务,例如在直线 y=2x 中,确定这条直线无需很多参数。但是,现代神经网络的规模通常远远超出预测的要求,这种情况被称为过度参数化。在去年 12 月入选 NeurIPS 的一篇论文《A Universal Law of Robustness via Isoperimetry》中,来自微软研究院的 Sébastien Bubeck 和斯坦福大学的 Mark Sellke 为神经网络扩展成功背后的奥秘提供了新的解释。他们表明,神经网络必须比传统预期规模要大得多,才能避免某些基本问题。这一发现为一个持续了几十年的问题提供了一般性见解。论文链接:https://arxiv.org/abs/2105.12806Mark Sellke 和 Sébastien Bubeck 瑞士洛桑联邦理工学院的 Lenka Zdeborová 表示:他们的研究触及了计算机科学的核心。神经网络规模的标准来自对其如何记忆数据的分析。但要了解数据记忆,我们必须首先了解网络的作用。神经网络中一项常见的任务是识别图像中的目标。为了创建这种网络,研究人员首先需要提供数据图像及其标注,然后对其进行训练以学习相关参数,之后模型能正确识别图像中的目标。换句话说,训练使网络记住数据。更值得注意的是,一旦网络记住了足够多的训练数据,它还能够以不同程度的准确率预测它从未见过的目标,这一过程称为泛化。网络的大小决定了它可以记住多少。这可以通过图形来理解,想象一下,将两个数据点放在 xy 平面上。你可以将这两个点与由两个参数描述的线连接起来。如果知道了这条线的一个点坐标以及一个原始数据点的 x 坐标,我们只需查看这条线(或使用参数)就可以计算出相应的 y 坐标。因为这条线已经记住了这两个数据点。神经网络的原理与此类似。例如,图像由成百上千个值描述 —— 每个像素是一个值。这些值在数学上等价于高维空间中一个点的坐标,坐标的数量称为维度。一个古老的数学结果表明,要将 n 个数据点与曲线拟合,则需要一个具有 n 个参数的函数。当神经网络在 1980 年代首次作为一种有影响的力量出现时,研究者的想法与此相同,他们认为对于神经网络来说,应该只需要 n 个参数来拟合 n 个数据点 —— 无论数据的维度如何。德克萨斯大学奥斯汀分校的 Alex Dimakis 表示:「现在的研究改变了,我们经常创建参数数量超过训练样本数量的神经网络。这意味着相关研究文献书籍必须重写。」Bubeck 和 Sellke 并没有打算重写任何东西。他们正在研究神经网络缺乏的另一种特性,称为稳健性(robustness),即网络处理微小变化的能力。例如,一个稳健性较差的网络可能已经学会了识别长颈鹿,但它会将一个几乎没有修改过的图片错误地标记为沙鼠,这就是网络稳健性带来的影响。 2019 年,当 Bubeck 及其同事意识到该问题与网络规模有关时,他们正在寻求证明有关该问题的定理。新研究表明过度参数化对于网络的稳健性是必要的。他们通过将数据点与曲线拟合所需的参数来做到这一点,该曲线具有与稳健性等效的数学属性:平滑度。为了看到这一点,再次想象平面中的一条曲线,其中 x 坐标代表单个像素的颜色,y 坐标代表图像标签。由于曲线是平滑的,如果你稍微修改像素的颜色,沿着曲线移动一小段距离,相应的预测只会发生很小的变化。另一方面,对于极度锯齿状的曲线,x 坐标(颜色)的微小变化会导致 y 坐标(图像标签)发生剧烈变化,原本识别为长颈鹿的图像可以变成沙鼠。Bubeck 和 Sellke 的研究表明,平滑拟合高维数据点不仅需要 n 个参数,还需要 n × d 个参数,其中 d 是输入的维度(例如,784 表示 784 像素的图像)。换句话说,如果你想让神经网络稳健地记住它的训练数据,过度参数化不仅有帮助 —— 而是绝对有效。证明依赖于一个关于高维几何的奇特事实 —— 即放置在球体表面上的随机分布的点,几乎都彼此相距一个完整的直径。点与点之间的大间隔意味着用一条平滑曲线拟合它们需要许多额外的参数。耶鲁大学的 Amin Karbasi 表示,「这个证明非常基础 —— 不需要繁重的数学运算,它说明了一些非常普遍的东西。」该结果提供了一种新方法来理解为什么扩大神经网络规模的简单策略如此有效。与此同时,其他研究揭示了过度参数化带来帮助的更多原因,例如它可以提高训练过程的效率,以及网络的泛化能力。虽然我们现在知道过度参数化对于稳健性是必要的,但尚不清楚稳健性对其他事物的必要性。通过将其与过度参数化联系起来,新的证据似乎表明稳健性可能比想象的更加重要,是一个可以带来许多好处的关键因素。「稳健性似乎是泛化的先决条件,」Bubeck 说到。「如果你有一个系统,你只是稍微扰乱它,然后它就失控了,这会是怎样的系统?这是不可接受的,这是一个非常基础和基本的要求。」责任编辑:张燕妮 来源: 机器之心
-
源代码:https://arxiv.org/pdf/2112.08782.pdf 一、前言 交通标志检测对于无人驾驶系统来说是一项具有挑战性的任务,特别是对于多尺度目标的检测和检测的实时性问题。在交通标志检测过程中,目标的尺度变化很大,会对检测精度产生一定的影响。 特征金字塔被广泛用于解决这个问题,但它可能会破坏不同尺度交通标志的特征一致性。而且,在实际应用中,常用的方法很难在保证检测实时性的同时提高多尺度交通标志的检测精度。 在今天分享中,研究者提出了一种改进的特征金字塔模型,命名为AF-FPN,它利用自适应注意力模块(AAM)和特征增强模块(FEM)来减少特征图生成过程中的信息丢失并增强表示能力的特征金字塔。将YOLOv5中原有的特征金字塔网络替换为AF-FPN,在保证实时检测的前提下提高了YOLOv5网络对多尺度目标的检测性能。此外,提出了一种新的自动学习数据增强方法来丰富数据集并提高模型的鲁棒性,使其更适合实际场景。在Tsinghua-Tencent 100K (TT100K) 数据集上的大量实验结果证明了与几种最先进的方法相比所提出的方法的有效性和优越性。 二、背景 交通标志识别系统化是自动驾驶中最重要的一部分,怎样去提升交通标志检测和识别技术的精度和实时性能,这个也是现在当技术实际落地时需要解决的重要问题。传统的CNN通常需要大量的参数和浮点运算 (FLOP) 以达到准确性令人满意的效果,例如ResNet-50有大约2560万个参数和需要4.1B FLOPs来处理大小为224×224的图像。然而,移动设备(例如智能手机和自动驾驶汽车)有限的内存和计算资源不能用于大型网络的部署和推理。作为一个one-stage检测器,使用YOLOv5是由于具有计算量小、速度快的优点。三、新框架详细分析 The improved YOLOv5s network framework作为当前YOLO系列中的最新框架,卓越的YOLOv5其灵活性使其便于快速在车辆硬件方面进行部署。YOLOv5包含四个模型,分别是YOLOv5s、YOLOv5m、YOLOv5l和YOLOv5x。YOLOv5s是YOLO系列最小的模型,更适合部署在车载移动硬件平台,由于其内存大小为14.10M,但识别精度达不到准确、高效识别的要求,尤其是用于识别小规模目标。YOLOv5的基本框架可以分为四个部分:input、backbone、neck和prediction。Input部分通过数据增强来丰富数据集,它具有对硬件设备要求低,计算量成本低。但是它会导致数据集中原来的小目标变小,从而导致数据集的恶化,降低模型的泛化性能。Backbone部分主要由CSP模块组成,它们通过CSPDarknet53执行特征提取。FPN和PANet用于聚合Neck现阶段的图像特征。最后,网络通过Prediction进行目标预测和输出。研究者引入AF-FPN和自动学习数据增强来解决模型大小和识别精度不兼容的问题,进一步提高模型的识别性能。将原有的FPN结构替换为AF-FPN,以提高识别多尺度目标的能力,并在识别速度和准确率之间做出有效的权衡。此外,研究者去除原始网络中的mosaic augmentation,并根据自动学习数据增强策略使用最佳数据增强方法来丰富数据集并提高训练效果。改进后的YOLOv5s网络结构如下图所示。AF-FPN structureAF-FPN在传统特征金字塔网络的基础上,增加了自适应注意力模块(AAM)和特征增强模块(FEM)。前一部分由于减少了特征通道,减少了在高层特征图中上下文信息的丢失;后一部分增强了特征金字塔的表示并加快了推理速度,同时实现了最先进的性能。AF-FPN的结构如下图所示。AAM的具体结构如下图所示,作为自适应注意力模块的输入,C5的大小为S=h×w。它首先通过自适应池化层获得不同尺度(β1×S,β2×S,β3×S)的上下文特征。然后每个上下文特征经过1×1卷积,得到相同的通道维度256。使用双线性插值将它们上采样到S的尺度,用于后续融合。空间注意力机制通过一个Concat层将三个上下文特征的通道合并,然后特征图依次通过1×1卷积层、ReLU激活层、3×3卷积层和sigmoid激活层生成对应的空间权重。生成的权重图和合并通道后的特征图进行Hadamard乘积运算,分离后加入到输入特征图M5中,将上下文特征聚合到M6中。最终的特征图具有丰富的多尺度上下文信息,在一定程度上缓解了由于通道数减少而造成的信息丢失。FEM主要利用空洞卷积根据检测到的交通标志的不同尺度自适应学习每个特征图中不同的感受野,从而提高多尺度目标检测和识别的准确性。如上图所示,它可以分为两个部分:多分支卷积层和多分支池化层。多分支卷积层用于通过空洞卷积为输入特征图提供不同大小的感受野。并且平均池化层用于融合来自三个分支感受野的交通信息,以提高多尺度预测的准确性。Data Augmentation数据增强我就简单描述下,具体如下示例:四、实验结果及可视化Size distribution of sign instances from the TT100K在TT100K数据集上与其他模型的性能比较 每种方法对19种交通标志的漏检率比较移动设备部署及通过摄像头拍摄的检测实例
-
# -*- coding=UTF-8 -*- import tensorflow as tf # 输入数据 import input_data mnist = input_data.read_data_sets("/tmp/data/", one_hot=True) # 定义网络超参数 learning_rate = 0.001 training_iters = 200000 batch_size = 64 display_step = 20 # 定义网络参数 n_input = 784 # 输入的维度 n_classes = 10 # 标签的维度 dropout = 0.8 # Dropout 的概率 # 占位符输入 x = tf.placeholder(tf.types.float32, [None, n_input]) y = tf.placeholder(tf.types.float32, [None, n_classes]) keep_prob = tf.placeholder(tf.types.float32) # 卷积操作 def conv2d(name, l_input, w, b): return tf.nn.relu(tf.nn.bias_add( tf.nn.conv2d(l_input, w, strides=[1, 1, 1, 1], padding='SAME'),b) , name=name) # 最大下采样操作 def max_pool(name, l_input, k): return tf.nn.max_pool(l_input, ksize=[1, k, k, 1], strides=[1, k, k, 1], padding='SAME', name=name) # 归一化操作 def norm(name, l_input, lsize=4): return tf.nn.lrn(l_input, lsize, bias=1.0, alpha=0.001 / 9.0, beta=0.75, name=name) # 定义整个网络 def alex_net(_X, _weights, _biases, _dropout): _X = tf.reshape(_X, shape=[-1, 28, 28, 1]) # 向量转为矩阵 # 卷积层 conv1 = conv2d('conv1', _X, _weights['wc1'], _biases['bc1']) # 下采样层 pool1 = max_pool('pool1', conv1, k=2) # 归一化层 norm1 = norm('norm1', pool1, lsize=4) # Dropout norm1 = tf.nn.dropout(norm1, _dropout) # 卷积 conv2 = conv2d('conv2', norm1, _weights['wc2'], _biases['bc2']) # 下采样 pool2 = max_pool('pool2', conv2, k=2) # 归一化 norm2 = norm('norm2', pool2, lsize=4) # Dropout norm2 = tf.nn.dropout(norm2, _dropout) # 卷积 conv3 = conv2d('conv3', norm2, _weights['wc3'], _biases['bc3']) # 下采样 pool3 = max_pool('pool3', conv3, k=2) # 归一化 norm3 = norm('norm3', pool3, lsize=4) # Dropout norm3 = tf.nn.dropout(norm3, _dropout) # 全连接层,先把特征图转为向量 dense1 = tf.reshape(norm3, [-1, _weights['wd1'].get_shape().as_list()[0]]) dense1 = tf.nn.relu(tf.matmul(dense1, _weights['wd1']) + _biases['bd1'], name='fc1') # 全连接层 dense2 = tf.nn.relu(tf.matmul(dense1, _weights['wd2']) + _biases['bd2'], name='fc2') # Relu activation # 网络输出层 out = tf.matmul(dense2, _weights['out']) + _biases['out'] return out # 存储所有的网络参数 weights = { 'wc1': tf.Variable(tf.random_normal([3, 3, 1, 64])), 'wc2': tf.Variable(tf.random_normal([3, 3, 64, 128])), 'wc3': tf.Variable(tf.random_normal([3, 3, 128, 256])), 'wd1': tf.Variable(tf.random_normal([4*4*256, 1024])), 'wd2': tf.Variable(tf.random_normal([1024, 1024])), 'out': tf.Variable(tf.random_normal([1024, 10])) } biases = { 'bc1': tf.Variable(tf.random_normal([64])), 'bc2': tf.Variable(tf.random_normal([128])), 'bc3': tf.Variable(tf.random_normal([256])), 'bd1': tf.Variable(tf.random_normal([1024])), 'bd2': tf.Variable(tf.random_normal([1024])), 'out': tf.Variable(tf.random_normal([n_classes])) } # 构建模型 pred = alex_net(x, weights, biases, keep_prob) # 定义损失函数和学习步骤 cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(pred, y)) optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost) # 测试网络 correct_pred = tf.equal(tf.argmax(pred,1), tf.argmax(y,1)) accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32)) # 初始化所有的共享变量 init = tf.initialize_all_variables() # 开启一个训练 with tf.Session() as sess: sess.run(init) step = 1 # Keep training until reach max iterations while step * batch_size < training_iters: batch_xs, batch_ys = mnist.train.next_batch(batch_size) # 获取批数据 sess.run(optimizer, feed_dict={x: batch_xs, y: batch_ys, keep_prob: dropout}) if step % display_step == 0: # 计算精度 acc = sess.run(accuracy, feed_dict={x: batch_xs, y: batch_ys, keep_prob: 1.}) # 计算损失值 loss = sess.run(cost, feed_dict={x: batch_xs, y: batch_ys, keep_prob: 1.}) print "Iter " + str(step*batch_size) + ", Minibatch Loss= " + "{:.6f}".format(loss) + ", Training Accuracy= " + "{:.5f}".format(acc) step += 1 print "Optimization Finished!" # 计算测试精度 print "Testing Accuracy:", sess.run(accuracy, feed_dict={x: mnist.test.images[:256], y: mnist.test.labels[:256], keep_prob: 1.})
-
自回归模型(AR)的滤波器技术在检测局部⻮轮⻮故障⽅⾯优于传统使⽤的残差分析技术。现有的AR滤波器技术性能良好,但基于⾃相关测量,对可⽤于区分噪声和脉冲的相位关系不敏感。最小熵反卷积技术可以通过信号的⾼阶统计 (HOS) 特性,特别是峰度,利⽤相位信息来增强检测新出现的轮⻮故障的能力。H. Endo*和R.B. Randall的实验结果验证了AR和MED 联合滤波技术在检测⻮轮剥落和⻮⻆裂纹⽅⾯的优越性能。AR和MED滤波技术的齿轮故障诊断实验从新南威尔士大学的齿轮试验台测量的振动信号用于比较AR和MED过滤器与原始AR过滤器在检测齿轮齿故障方面的有效性。其中考虑了四组单位⽐正⻮轮(32×32⻮):三组具有不同尺⼨⻮⽚剥落的钢⻮轮和一对带有⼈⼯切割⻮圆⻆裂纹(TFC)的塑料⻮轮。带有种⼦故障的⻮轮如图1所⽰,故障的尺⼨在表1中给出。⻮轮箱上的振动(加速度)信号是在⻮轮以168rpm 的恒定速度运行时测量的。图1. 种子⻮轮故障。 (a) Sp25%,(b) Sp50%,(c) Sp100% 和 (d) TFC(塑料⻮轮) 表1 轮齿故障尺寸1.⻮轮剥落图2显⽰了带有剥落的⻮轮的AR滤波器和ARMED的未处理信号和残差。这些信号是在以168 rpm轴速和负载67 Nm的⻮轮运行时测量的扭矩。信号的相应功率谱如图3所⽰。注意:在图2和3中,(a)、(b) 和 (c) 列分别对应于未处理的信号、AR残差和ARMED 输出。第 1、2 、3 行分别对应损坏类型:剥落25%、剥落50%和剥落100%。图2.信号⽐较(⻮轮剥落)图3.功率谱⽐较(⻮轮剥落)在图2(a1)-(a3)中未处理的信号中看不到剥落的影响。在图2(b1)-(b3)的AR滤波器的残差中,由于⼤剥落 (Sp100%) 导致的每⻮轮一次旋转脉冲变得可⻅,但较⼩剥落的症状,如Sp25%和Sp50%是不清楚的(图2(a1) 和 (a2))。图2(c1)-(c3)所⽰的ARMED结果清楚地证明了MED滤波器在增强剥落脉冲⽅⾯的有效性。以前在AR残差中未检测到的较⼩剥落(Sp25%和Sp50%)的脉冲在ARMED结果中清晰可⻅。图2中的信号频谱如图3所⽰。在功率谱的平坦幅度中观察到AR和MED滤波器的“⽩化”效应。一般来说,ARMED结果的光谱看起来⽐AR残差的光谱更平坦。AR残差的频谱在2000 Hz左右开始滚降,因为AR滤波器在准确捕获⾼频区域的特征⽅⾯变得不那么有效,这会导致⽆效的逆滤波,从⽽导致滚降效应。2.齿脚裂纹图4显⽰了带TFC的AR和ARMED滤波器的未处理信号和残差,它们的功率谱如图5所⽰。在图4(c1)-(c5)中可以看出,ARMED结果中故障信号的峰度随着扭矩的⼤⼩⽽增加。注意:在图4和5中,(a)、(b) 和 (c) 列分别对应于未处理的信号、AR残差和ARMED输出。第1-5行对应于施加在⻮轮上的不同负载⽔平:分别为10、15、20、25 和 30 Nm。图4.信号⽐较(不同负载的 TFC)图5.功率谱⽐较(不同负载的 TFC)在未处理信号中未检测到的 TFC 的影响(图4(a1)-(a5))在AR的残差中可⻅(图4(b1)-(b5)),并且故障脉冲进一步增强(图4(c1)-(c5))。虽然TFC的影响可以在AR和ARMED的输出中识别出来,但故障脉冲的清晰度在ARMED结果中明显更好,这也反映在信号的峰度上。结论通过针对⻮轮剥落和齿脚裂纹实验,研究了MED增强局部⻮轮⻮故障的脉冲样效应的峰度的能力。MED已被证明可以补充现有的AR过滤技术,以提⾼其检测⻮轮⻮故障的能力。AR和MED的组合滤波技术在检测剥落和齿脚裂纹方面显示出显著的改进。 参考文献:[1]. H. Endo*, R.B. Randall, Enhancement of autoregressive model based gear tooth fault detection technique by the use of minimum entropy deconvolution filter.
-
AlexNet模型AlexNet中包含了几个比较新的技术点,也首次在CNN中成功应用了ReLU、Dropout和LRN等Trick。同时AlexNet也使用了GPU进行运算加速。AlexNet将LeNet的思想发扬光大,把CNN的基本原理应用到了很深很宽的网络中。AlexNet主要使用到的新技术点如下:(1)成功使用ReLU作为CNN的激活函数,并验证其效果在较深的网络超过了Sigmoid,成功解决了Sigmoid在网络较深时的梯度弥散问题。虽然ReLU激活函数在很久之前就被提出了,但是直到AlexNet的出现才将其发扬光大。(2)训练时使用Dropout随机忽略一部分神经元,以避免模型过拟合。Dropout虽有单独的论文论述,但是AlexNet将其实用化,通过实践证实了它的效果。在AlexNet中主要是最后几个全连接层使用了Dropout。(3)在CNN中使用重叠的最大池化。此前CNN中普遍使用平均池化,AlexNet全部使用最大池化,避免平均池化的模糊化效果。并且AlexNet中提出让步长比池化核的尺寸小,这样池化层的输出之间会有重叠和覆盖,提升了特征的丰富性。(4)提出了LRN层,对局部神经元的活动创建竞争机制,使得其中响应比较大的值变得相对更大,并抑制其他反馈较小的神经元,增强了模型的泛化能力。(5)使用CUDA加速深度卷积网络的训练,利用GPU强大的并行计算能力,处理神经网络训练时大量的矩阵运算。AlexNet使用了两块GTX 580 GPU进行训练,单个GTX 580只有3GB显存,这限制了可训练的网络的最大规模。因此作者将AlexNet分布在两个GPU上,在每个GPU的显存中储存一半的神经元的参数。因为GPU之间通信方便,可以互相访问显存,而不需要通过主机内存,所以同时使用多块GPU也是非常高效的。同时,AlexNet的设计让GPU之间的通信只在网络的某些层进行,控制了通信的性能损耗。 (6)数据增强,随机地从256*256的原始图像中截取224*224大小的区域(以及水平翻转的镜像),相当于增加了2*(256-224)^2=2048倍的数据量。如果没有数据增强,仅靠原始的数据量,参数众多的CNN会陷入过拟合中,使用了数据增强后可以大大减轻过拟合,提升泛化能力。进行预测时,则是取图片的四个角加中间共5个位置,并进行左右翻转,一共获得10张图片,对他们进行预测并对10次结果求均值。同时,AlexNet论文中提到了会对图像的RGB数据进行PCA处理,并对主成分做一个标准差为0.1的高斯扰动,增加一些噪声,这个Trick可以让错误率再下降1%。
-
简介最小熵反褶积(MED)方法被广泛应用于机械故障检测领域,最早由Wiggins提出,之后被Sawalhi于2007年应用到滚动轴承故障诊断中,是一种自适应的滤波方法,主要目的是通过寻找一个最优反卷积器突出信号的大的脉冲,因此通常使用**峭度**(Kurtosis)作为计算的终止条件,用于判断机械的冲击故障。原理对于滚动轴承的故障诊断问题,假设信号采集模型为y(n)=h(n)∗x(n)+e(n)可以看出主要假设采集系统满足的是**卷积**模型而不是线性模型,其中x(n)为轴承振动的信号,h(n)为系统的传递函数,e(n)是系统噪声。先不考虑e(n),MED的目的是寻找一个反褶积器也可以叫逆滤波器w(n)将y(n)恢复出真实的振动信号x(n),即x(n)=w(n)∗y(n)Wiggins采用序列x^(n)的范数衡量熵的大小,并把其作为目标函数求解的最优结果,即这就是峭度的形式,当此范数为最大值时获得的逆滤波器w(n)为最优解,具体的推导过程可见(二)。算法MED算法一共分为五步仿真过程使用的工具包是Matlab论坛的Minimum Entropy Deconvolution Multipack,函数为med2d,输入信号是一个正弦信号上叠加很多脉冲波,使用MED方法可以有效检测出脉冲波。使用代码如下:n = 0:999; x = [sin(n/30) + 0.2*(mod(n,21)==0)]; % Run for 100 iterations, 30 sample FIR filter [y_final f_final kurt] = med2d(x’,30,100,[],’valid’,1);下图是输入信号和使用MED方法反卷积完的结果。可以看出能够提取脉冲部分,进而可以对脉冲频率进一步分析。30阶滤波器为学习次数图为可见6次迭代就达到峭度最大值即最优解的形式。小结本章主要对最小熵反卷积算法进行描述和实践验证。参考文献[1] Ralph A Wiggins. Minimum entropy deconvolution.Geoexploration, 16(1-2):21–35, 1978.[2] 王晗,何刘.最小熵解卷积法轮对轴承故障诊断[J].中国测试,2016,42(01):114-120.本文转载于:http://cyrusblog.cn/index.php/2020/10/24/%E6%BB%A4%E6%B3%A2%E4%B9%8B%E6%9C%80%E5%B0%8F%E7%86%B5%E5%8F%8D%E8%A4%B6%E7%A7%AFmed%E4%B8%80/
-
这周我们简单介绍一个高效分子优化的方法。该工作由UIUC的Jimeng Sun组合MIT的Connor Coley组合作完成,对应的文章题目是Differentiable Scaffolding Tree for Molecule Optimization[1],被2022年ICLR接受,主要的代码和数据发布在https://github.com/futianfan/DST。思路:基于梯度的分子优化分子的可微分骨架树类梯度上升的优化算法优化效果测试由可微性得到的可解释性思路:基于梯度的分子优化在药物发现中,分子优化,即找到具有理想性质的分子结构,是核心的一步。由于化学结构的复杂性,传统上我们只能依赖于一些启发式的组合优化算法,如遗传算法、树搜索等。最近深度学习的发展确实提供了一些新的思路,但目前大部分依赖图生成算法的分子优化都是通过图神经网络(graph neural network, GNN)来显式地生成一个分子,然后优化目标函数,通过反向传播梯度来更新GNN参数,使得网络生成具有优化性质的分子。例如在增强学习(reinforcement learning, RL)中目标函数是根据反馈(reward)定义的;在深度生成模型(deep generative model, DGM)中基于和目标分子的广义距离定义。但这些算法普遍优化能力不够强,尤其没有考虑oracle的成本,许多算法需要调用数十万甚至百万次oracle才能得到较好的结果,而这在实际分子设计过程中显然是不现实的。我们知道,数值优化的核心就是在一个点估计其指向极值点的方向,而这一方向一般可以通过梯度估计。那我们是否可以估计一个分子的性质相对于结构的梯度,通过这个梯度估计方向进而优化一个分子?在Alan Aspuru-Guzik组的Deep Molecular Dreaming[2]一文中作者利用分子的字符串(SELFIES)表示实现了这一点:将分子看做每个位置字符的分布概率,通过一个一维卷积神经网络(convolutional neural network, CNN)学习其性质,得到可微的性质预测器,进而估计分子的梯度,但是效果并不好。而在本文中,作者通过提出分子的可微分骨架树(Differentiable Scaffolding Tree, DST)这一概念,使得分子直接在结构层面上可微,进而构建了一个高效的优化算法。与其他生成模型不同,作者先预训练(pre-train)了一个以骨架树(ST)为输入的GNN来预测性质(标量)。然后在优化过程中固定GNN参数,每步迭代里首先构造分子相应的DST,通过前向传播用GNN来预测性质,然后优化目标性质并通过反向传播梯度来更新DST里的参数,进而优化分子结构。分子的可微分骨架树首先我们明确本文关注从头分子优化(de novo molecule optimization),即以一个优化算法在一个隐式定义的小分子空间上找到性质较好的分子。而分子性质由一个Oracle给出,即给定一个分子,输出相对应的性质,可以看作一个黑盒函数(black box function of molecules),例如衡量一个分子的类药性的QED。为了使分子在图结构层面上可微,首先需要扩展分子图的概念。另外为了避免生成环的中间步骤可能带来的不必要的麻烦,作者选择在优化过程中用骨架树(scaffolding tree, ST)来表示分子,其节点定义为一个基本单位(substructure),包含了常见的原子和单环(详见原文附录Figure 5)。我们可以用节点的类别矩阵(node indicator matrix)和节点之间的链接矩阵(adjacency matrix)表示一个骨架树。其中类别矩阵每一行是一个one-hot向量,代表了该节点是哪一个基本单位,而链接矩阵中的每一个元素都是binary的数字,指示每一对节点之间是否连接。构造可微分骨架树(DST)的核心是将节点的类别和连接看做可学习的0到1的概率分布,而非0或1的binary code。其中为了实现连接可微性的自洽,作者提出了与连接等价的权重向量(node weight vector),通过一个节点的权重表示其存在与否,并通过权重构造连接矩阵,将连接与否的问题变成了该节点是否存在的问题:从骨架树得到可微分骨架树的方法如下所示:首先将分子结构抽象为骨架树, 然后将骨架树中每个结点连接上一个拓展节点(expansion node)。每一个叶结点和拓展结点的权重和类别是可学习的(learnable)。其中节点类别是一个softmax的输出,保证和为1。结点权重是一个sigmoid的输出,保证在0-1之间。类梯度上升的优化算法为了进行优化,作者首先预先训练(pre-train)了一个GNN来做性质预测,其输入是一个分子的可微分骨架树,输出是目标的性质(标量),即。为了平衡不同权重节点的贡献,作者在GNN中使用了加权平均的read-out方法:其中代表第回迭代之后的节点特征(node embedding)的第行,代表第个节点的权重,代表全连接网络。整个算法是一个迭代式优化。在单步迭代中,给定输入分子的DST,得到了可微的性质预测替代后,可以通过任意梯度优化算法(文中使用了Adam)解来得到优化后的DST。在得到优化后的DST后,根据其优化后的权重和类别,作者设计了如下三种在对应骨架树上的操作:(1)删除(SHRINK)叶结点权重小时,意味着该节点对性质提升没有帮助,或者说该节点的存在对性质提升有负面影响,所以在对应骨架树上删除该节点。(2)拓展(EXPAND)拓展节点权重大时,意味着该节点的存在对性质提升帮助是正向的,所以在对应骨架树上加上一个新的结点。该节点的类别也从对应softmax输出值中选择。(3)替换(REPLACE)若一个节点权重改变不大,但类别改变较大时,不删除也不拓展,但是在优化后的分布中重新采样一个substructure(softmax输出中值比较大的)。根据更新后的DST采样其中一个操作,得到对应的骨架树作为下一轮迭代的输入,如此我们迭代地优化分子。在每一轮迭代内DST的维数是固定的,由输入分子决定,因此一轮迭代只能得到和原分子相差最多一个节点的分子。但在多轮迭代优化过程中,每一轮的输入都是上一轮的输出,因此相应的DST维度也会变化,使得生成分子的大小只受限于优化迭代次数。在得到优化后的骨架树后,作者枚举对应的所有可能的分子图,用oracle测量每一个分子。为了有更好的优化效果,并兼具输出分子的多样性,作者每次优化时同时优化多条轨迹,并在其中使用determinantal point process(DPP)来选择保留的分子。即在每一部枚举出对应的多个可能的分子图之后,不是单纯根据性质好坏,而额外考虑了相似性矩阵的行列式,即选择最大化下式的一批分子:其中是subset 这批分子的性质分数的对角矩阵,而则是这批分子的相似性矩阵。可以注意到单纯依据的行列式挑选就是greedy的top-k选择。而相似矩阵的行列式的最大化则鼓励subset内的diversity的增加(可以考虑一个的例子,对角线为1,非对角为彼此之间的相似度)。如此我们便得到了一个完整的优化算法。优化效果测试作者首先衡量主要的优化效果,包含了单目标优化和多目标优化(同时优化多个性质)。为了能够有比较全面的对比,所有算法选择了分数最高的100个分子衡量其:新颖性(Nov):生成分子不在训练集(如果有)中的比例;多样性(Div):生成分子的多样性,衡量对化学空间的探索能力;目标性质的平均优化结果(APS);Oracle调用的次数(#oracle):我们关注有限的oracle调用的情况下的表现,因为oracle调用的数量是衡量一个算法效率的重要指标;由于DST和一些其他算法的一部分oracle调用可以离线完成(比如利用已有的标注数据),另一部分必须线上完成,所以#oracle是A+B的形式,A为线下调用,B为线上调用。从实验结果上看,直接运用了梯度信息的DST优化效率最高,说明了由DST估计的梯度的可靠性。深度生成模型(LigGPT)由于其本身并不是一个迭代优化算法,表现并不好。增强学习方法(GCPN/MolDQN)虽然在无限oracle调用的情况下能够得到一些较好的结果,但是不出所料在限制oracle调用的情况下表现相对不好。而以传统的组合优化方法为基础的算法(如GA+D,MARS)表现相对还是更好。为了更系统地比较算法效率,作者测试了算法的oracle efficiency,即不同方法在不同oracle调用次数下的优化性能。结果如下:Oracle efficiency测试结果。其中DST-rand为DST的ablation study,即同样设定下每步随机选择骨架树上的操作。横轴为oracle调用数量,纵轴为top-100个分子的平均性质(越高越好)。DST在三个任务上都取得了最好的效果,其他结论也和第一个实验类似。由可微性得到的可解释性作者另外展示了由DST带来的分子性质的可解释性。通过观察当前DST对各个结点权重和梯度,我们可以看到不同的结点对性质提升的影响,进而分析不同基团、亚结构对性质的影响。分子可解释性实例。
-
文字识别也是目前CV的主要研究方向之一。本文主要总结目前文字识别方向相关内容,包括单独文字识别以及结合文字检测和文字识别的端到端的文字识别。希望这篇文章能够帮助各位。 图0 文字检测Detection与文字识别Recognition对于文字识别,实际中一般首先需要通过文字检测定位文字在图像中的区域,然后提取区域的序列特征,在此基础上进行专门的字符识别。但是随着CV发展,也出现很多端到端的End2End OCR。文字检测(Text Detection)文字检测定位图片中的文本区域,而Detection定位精度直接影响后续Recognition结果。图1.1如图1.1中,红框代表“LAN”字符ground truth(GT),绿色框代表detection box。在GT与detection box有相同IoU的情况下,识别结果差异巨大。所以Detection对后续Recognition影响非常大! 目前已经有很多文字检测方法,包括:EAST/CTPN/SegLink/PixelLink/TextBoxes/TextBoxes++/TextSnake/MSR/... 其中CTPN方法的介绍如下:场景文字检测—CTPN原理与实现https://zhuanlan.zhihu.com/p/34757009文字识别(Text Recognition)识别水平文本行,一般用CRNN或Seq2Seq两种方法(欢迎移步本专栏相关文章):• CRNN:**CNN+RNN+CTC**一文读懂CRNN+CTC文字识别https://zhuanlan.zhihu.com/p/43534801• CNN+Seq2Seq+AttentionSeq2Seq+Attention原理介绍https://zhuanlan.zhihu.com/p/51383402对应OCR代码如下https://github.com/bai-shang/crnn_seq2seq_ocr_pytorch对于特定的弯曲文本行识别,早在CVPR2016就已经有了相关paper:• Robust Scene Text Recognition with Automatic Rectification. CVPR2016.arxiv.org/abs/1603.03915图2.1对于弯曲不规则文本,如果按照之前的识别方法,直接将整个文本区域图像强行送入CNN+RNN,由于有大量的无效区域会导致识别效果很差。所以这篇文章提出一种通过STN网络学习变换参数,将Rectified Image对应的特征送入后续RNN中识别。图2.2其中Spatial Transformer Network(STN)指:arxiv.org/abs/1506.02025核心就是将传统二维图像变换(如旋转/缩放/仿射等)End2End融入到网络中。具体二维图像变换知识请翻阅:Homograph单应性从传统算法到深度学习:https://zhuanlan.zhihu.com/p/74597564• Scene Text Recognition from Two-Dimensional Perspective. AAAI2018.该篇文章于MEGVII 2019年提出。首先在文字识别网络中加入语义分割分支,获取每个字符的相对位置。图2.4其次,在获取每个字符位置后对字符进行分类,获得文字识别信息。该方法采用分类解决识别问题,并没有像传统方法那样使用RNN。图2.5除此之外,在文章中还是使用了Deformable Convolution可变形卷积。相比传统3x3卷积,可变形卷积可以提取文字区域不同形状的特征。图2.6• SqueezedText: A Real-time Scene Text Recognition by Binary Convolutional Encoderdecoder Network. AAAI2018.https://ren-fengbo.lab.asu.edu/sites/default/files/16354-77074-1-pb.pdf该文章引入二值层(-1 or +1)部分替换CRNN中的float浮点卷积,核心是使用很小的网络进行识别。• Handwriting Recognition in Low-resource Scripts using Adversarial Learning. CVPR2019.arxiv.org/pdf/1811.01396.pdf• ESIR: End-to-end Scene Text Recognition via Iterative Image Rectification. CVPR2019.http:openaccess.thecvf.com/content_CVPR_2019/papers/Zhan_ESIR_End-To-End_Scene_Text_Recognition_via_Iterative_Image_Rectification_CVPR_2019_paper.pdf图2.7ESIR采用cascade R-CNN级联思路,通过3次变换将弯曲字符变换为水平,再经过LSTM识别。具体变换思路请查阅论文。End2End OCR (Detection+ Recognition)由于End2End OCR同时涉及文字检测+文字识别两个方向,对于不熟悉的读者建议首先阅读上述CTPN/CRNN/Seq2Seq三篇文章了解相关内容(当然求点赞喽)。在之前介绍的算法中,文字检测和文字识别是分为两个网络分别完成的,所以一直有研究希望将OCR中的Detection+ Recognition合并成一个End2End网络。目前End2End OCR相关研究如下:• Towards End-to-end Text Spotting with Convolutional Recurrent Neural Networks. ICCV2017.http:openaccess.thecvf.com/content_ICCV_2017/papers/Li_Towards_End-To-End_Text_ICCV_2017_paper.pdf图3.1该篇文章采用Faster R-CNN的Two-stage结构:首先Text Proposal Network(即RPN)生成对应的文本区域Text Proposal,后续通过Bounding Box regression和Box Classification进一步精修文本位置。但是不同的是,在RoI Pooling后接入一个LSTM+Attention的文字识别分支中,如图3.2。由于识别与之前介绍的文字识别方法大同小异,后续不再重复介绍。图3.2但是这样的结构存在问题。举例说明:Faster R-CNN的RPN只是初步产生Proposal,后续还需要再经过一次Bounding Box regression才能获取准确的检测框,该问题在CTPN论文(arxiv.org/abs/1609.03605)中有说明,如图3.3:图3.3 CTPN文章中提及RPN生成Proposal不准的问题所以Text Proposal不一定很准会对后续识别分支产生巨大影响,导致该算法在复杂数据集上其实并不是很work。• Deep TextSpotter: An End-to-End Trainable Scene Text Localization and Recognition Framework. ICCV2017.http:openaccess.thecvf.com/content_ICCV_2017/papers/Busta_Deep_TextSpotter_An_ICCV_2017_paper.pdf图3.4 Deep TextSpotter在与Faster R-CNN不同,Deep TextSpotter生成的Region Proposal包含6个数值: 其中 代表Proposal box在图像中的位置, 代表Proposal box与水平方向的夹角, 代表置信度confidence。 对于Region Proposal所在的特征 ,通过双线性插值可以获得 固定高度的变换后的特征 , 其中 代表双线性采样核,本质就是传统的图像旋转+缩放插值变换。图3.5在获得 后,显然可以后接RNN+CTC进行识别。可以看到Deep TextSpotter通过学习角度 ,将proposal通过双线性插值变换为固定高度的水平特征,然后再进行识别,达到一种End2End的效果。与同时期的上一个方法类似,同样存在RPN生成Proposal不准导致识别率低的问题,所以在复杂数据集实际效果可能并不是太好。图3.6 Deep TextSpotter对应的CTC识别• Attention-based Extraction of Structured Information from Street View Imagery. ICDAR2017.arxiv.org/abs/1704.03549图3.7 spatial attention ocr该文章由Google在2017年提出,主要针对多视角的街景采集数据进行OCR,其关键点为:1. 利用CNN提取不同视角的图片的特征,并将特征concat为一个大的特征矩阵2. 计算图片中文的spatial attention , 越大该区域为文字区域的概率越大3. 通过 抽取 中文字区域特征 ,并送入后续RNN进行识别该方法利用spatial attention(arxiv.org/pdf/1502.03044v3.pdf)进行端到端OCR,相比检测+检测方法更加新颖。• Mask TextSpotter: An End-to-End Trainable Neural Network for Spotting Text with Arbitrary Shapes. ECCV2018.arxiv.org/abs/1807.02242图3.8 Mask TextSpotter该方法由旷视科技 (www.zhihu.com/people/c26b4202ed6af1379f52a967235d94b2) 在2018年提出,主要用于解决不规则弯曲字符End2End的识别问题。相比倾斜字符,处理弯曲不规则字符更难,无法简单通过Proposal角度 对特征进行变换。Mask TextSpotter借鉴了Mask RCNN,首先由RPN网络生成Proposal,再由Faster R-CNN分支对Proposal做进一步分类和位置回归,同时通过Mask分支分割出文本所在区域Global word map和每个字符所在中心Background map。这样不仅可以获得整个文本word区域,还可以获得每个字符character区域。图3.9 Mask TextSpotter进行文字识别在文字识别方面Mask TextSpotter设计0~1和A~Z共计36个“one-hot”形式的Character map进行分类,即没有使用RNN直接强行分类。如果用Mask TextSpotter识别汉字,则需要设计4000+ Character map,这显然是不科学的。另外该方法在识别过程中也没有用到文字的序列信息(总体来说该方法与之前的Scene Text Recognition from Two-Dimensional Perspective思路类似)。• Towards End-to-End License Plate Detection and Recognition: A Large Dataset and Baseline. ECCV2018.http:openaccess.thecvf.com/content_ECCV_2018/papers/Zhenbo_Xu_Towards_End-to-End_License_ECCV_2018_paper.pdf在该文章中提出一个包含250k图的中国车牌数据集CCPD,每个标注包含1个box+4个定位点+识别文字GT:图3.10 车牌数据集CCPD在网络方面该文章提出一种PRNet:1. 利用Box Regression layer层预测车牌位置 ;2. 检测出来 确定位置后,采集对应不同尺度的特征图进行ROI Pooling;3. 把不同尺度特征拼接在一起,进行识别。图3.11 PRNet该文章核心内容就是推出了一个车牌OCR数据集CCPD,并在这个数据集上提出一种BaseLine方法。该方向研究人员可以尝试使用该数据集。在这里特别感谢一下所有开放数据集的研究人员!数据才是cv第一生产力!• An end-to-end TextSpotter with Explicit Alignment and Attention. CVPR2018.http:openaccess.thecvf.com/content_cvpr_2018/papers/He_An_End-to-End_TextSpotter_CVPR_2018_paper.pdf改文章与Deep TextSpotter比较类似,首先生成带有角度 的倾斜Text Proposal,然后通过类似于RoI Pooling的Text-alignment提取固定长度的feature sequence,再送入RNN+Seq2Seq+Attention结构进行识别。图3.13与Deep TextSpotter不同的是,Text-alignment在通过双线性插值提取到整个Proposal特征后,再通过一组Inception卷积获取feature sequence送入RNN,而不是直接把双线性插值结果送入RNN。图3.15• FOTS: Fast Oriented Text Spotting with a Unified Network. CVPR2018.arxiv.org/abs/1801.01671FOTS采用Single-Shot结构结合(arxiv.org/abs/1612.03144)直接检测文字区域,输出带角度 的Bounding Box;之后利用双线性插值RoIRotate获取固定大小的特征,送入双向LSTM进行识别。图3.16 FOTS Architecture图3.17 FPN图3.18 RoIRotate由于使用Single-Shot结构,所以应该是相对“Fast”一点。• SEE: Towards Semi-Supervised End-to-End Scene Text Recognition. AAAI2018.arxiv.org/abs/1712.05404图3.19图3.20另外SEE作者2017年在arXiv上放出STN-OCR的论文,应该是没有中任何会议。考虑到完整性也挂在这里。arxiv.org/abs/1707.08831来自 | 知乎 作者 | 白裳链接 | https://zhuanlan.zhihu.com/p/65707543
-
在深度神经网络之后,以多头自注意力机制为核心的Vision Transformer因其对输入全局关联的强大建模能力得到了广泛应用和研究。尽管现有研究在模型结构、损失函数、训练机制等方面提出了诸多改进,但少有研究对Vision Transformer的工作机制进行了深入探索。本文为ICLR 2022中的亮点论文之一,提供了不同解释来帮助理解Vision Transformer (ViT)的优良特性:1)多头自注意力机制不仅提高了精度,而且通过使损失的超平面变得平坦,提高了泛化程度;2)多头自注意力机制和卷积模块表现出相反的行为。例如,多头自注意力机制是低通滤波器,而卷积模块是高通滤波器;3)多层的神经网络的行为就像一系列小的个体模型的串联;4)最后阶段的卷积模块在预测中起着关键作用。
-
1. 功能描述:MindSpore实现WeightNorm参数归一化。2. 实现分析:在MindSpore实现高性能方案,建议采用图模式,同时也能保证动静统一。MindSpore图模式需要把归一化操作表达到整图里,可以采用自定义的方式在网络结构中实现。3. 参数归一化功能简介(背景介绍):在深度学习中通常对卷积层的权重进行参数归一化,参数归一化功能根据以下公式对传入的 layer 中的权重参数进行归一化:image.png公式中w是网络权重,g 代表长度变量 ,v代表方向变量。权重归一化可以将神经网络中权重w的向量长度g与其方向v解耦,将w用g和v两个变量表示。 (例如:详细可以参考论文: https://arxiv.org/pdf/1602.07868.pdf。)4. 解决方案:实现MindSpore的WeightNorm需要注意:4.1 MindSpore实现时,需要封装一个Wrapper,将WeightNorm和需要进行参数归一化的网络结构(如卷积)封装为一个整体,这样每次在卷积执行之前,就会先执行WeightNorm。具体伪代码如下:class WeightNorm(nn.Cell): def __init__(self): ... register_w_v_g() self.layer = layer def construct(self, inputs): compute_weight_norm() result = self.layer(inputs) return result4.2 使用参数归一化需要能够添加和删除weight norm,但MindSpore静态图编译后无法删除Weight Normremove_weight_norm的场景:4.2.1 inference,即推理阶段需要移除Weight Norm。4.2.2 进行一次Weight Norm计算,然后固定w(WeightNorm.remove()的执行逻辑)remove_weight_norm的使用场景,即模型进行推理时,在加载Checkpoint后进行操作,此时未涉及到静态图的编译阶段,因此可以对实例化的模型进行任意修改。PS: 静态图不支持在训练过程中移除weight norm。MindSpore WeightNorm示例:class WeightNorm (nn.Cell): def __init__(self, module, dim:int=0): super().__init__() if dim is None: dim = -1 self.dim = dim self.module = module self.assign = P.Assign() # add g and v as new parameters and express w as g/||v|| * v self.param_g = Parameter(Tensor(norm_except_dim(self.module.weight, 2, dim))) self.param_v = Parameter(Tensor(self.module.weight.data)) self.module.weight.set_data(_weight_norm(self.param_v, self.param_g, self.dim)) self.use_weight_norm = True def construct(self, *inputs, **kwargs): if not self.use_weight_norm: return self.module(*inputs, **kwargs) self.assign(self.module.weight, _weight_norm(self.param_v, self.param_g, self.dim)) return self.module(*inputs, **kwargs) def remove_weight_norm(self): self.assign(self.module.weight, _weight_norm(self.param_v, self.param_g, self.dim)) self.use_weight_norm = False4.3 use_weight_norm可以达到移除WeightNorm的目的。即调用remove_weight_norm方法后,将self.use_weight_norm设置为False,当再次construct函数时,就会直接调用self.module,忽略Weight Norm计算。4.4 self.param_g = Parameter(Tensor(norm_except_dim(self.module.weight, 2, dim)))实现 w和 ||v|| 的计算,静态图不支持getattr方法,考虑到MindSpore的nn层设计,就固定module的权重为module.weight。def norm_except_dim(v, pow, dim): if dim == -1: return mnp.norm(v, pow) elif dim == 0: output_size = (v.shape[0],) + (1,) * (v.ndim - 1) return mnp.norm(v.view((v.shape[0], -1)), pow, 1).view(output_size) elif dim == (v.ndim - 1): output_size = (1,) * (v.ndim - 1) + (v.shape[v.ndim - 1]) return mnp.norm(v.view((-1, v.shape[v.ndim - 1])), pow, 0).view(output_size) else: return norm_except_dim(v.swapaxes(0, dim), pow, dim).swapaxes(0,dim)def _weight_norm(v, g, dim): return v * (g / norm_except_dim(v, 2, dim))4.5 上述代码WeightNorm中,self.module.weight是要进行归一化的网络权重,self.param_g是长度变量,self.param_v是方向变量, 其中norm_except_dim函数用于计算指定维度的长度。5. MindSpore的WeightNorm简单使用方式 #assume we need apply weight norm on nn.Dense layer m = WeightNorm(nn.Dense(20, 40)) #m.param_g.shape is (40, 1) #m.param_v.shape is (40, 20) #use m as normal nn.Dense inputs = Tensor(np.random.randn(10, 20), mstype.float32) outputs = m(inputs) #if you want to remove weight norm, just call it m.remove_weight_norm() #m.use_weight_norm == False————————————————原文链接:https://blog.csdn.net/qingshuibaifen/article/details/121610743
-
概述神经网络训练本质上是高维非凸函数的优化过程,一般可以通过梯度下降方法发现最小值点(如图1所示)。而一般的神经网络参数多达几万甚至几十万,较难直接在三维空间展示其优化地形。用户通过本功能,能够基于方向降维和绘制计算,将神经网络训练路径周围的优化空间展示出来。具体使用步骤共分为两步,以LeNet为例,分类任务,数据集为MNIST,训练数据收集:在训练过程中,利用SummaryCollector的形式收集多个模型前向网络权重,地形图绘制所需参数(如期望绘制区间,地形图分辨率等),代码如下:import mindspore.dataset as dsimport mindspore.dataset.vision.c_transforms as CVimport mindspore.dataset.transforms.c_transforms as Cfrom mindspore.dataset.vision import Interfrom mindspore import dtype as mstypeimport mindspore.nn as nnfrom mindspore.common.initializer import Normalfrom mindspore import contextfrom mindspore.train.callback import ModelCheckpoint, CheckpointConfig, LossMonitor, TimeMonitor, SummaryCollectorfrom mindspore import Modelfrom mindspore.nn import Accuracyfrom mindspore import set_seedset_seed(1)def create_dataset(data_path, batch_size=32, repeat_size=1, num_parallel_workers=1): """ create dataset for train or test """ # define dataset mnist_ds = ds.MnistDataset(data_path, shuffle=False) resize_height, resize_width = 32, 32 rescale = 1.0 / 255.0 shift = 0.0 rescale_nml = 1 / 0.3081 shift_nml = -1 * 0.1307 / 0.3081 # define map operations resize_op = CV.Resize((resize_height, resize_width), interpolation=Inter.LINEAR) # Bilinear mode rescale_nml_op = CV.Rescale(rescale_nml, shift_nml) rescale_op = CV.Rescale(rescale, shift) hwc2chw_op = CV.HWC2CHW() type_cast_op = C.TypeCast(mstype.int32) # apply map operations on images mnist_ds = mnist_ds.map(operations=type_cast_op, input_columns="label", num_parallel_workers=num_parallel_workers) mnist_ds = mnist_ds.map(operations=resize_op, input_columns="image", num_parallel_workers=num_parallel_workers) mnist_ds = mnist_ds.map(operations=rescale_op, input_columns="image", num_parallel_workers=num_parallel_workers) mnist_ds = mnist_ds.map(operations=rescale_nml_op, input_columns="image", num_parallel_workers=num_parallel_workers) mnist_ds = mnist_ds.map(operations=hwc2chw_op, input_columns="image", num_parallel_workers=num_parallel_workers) # apply DatasetOps buffer_size = 10000 mnist_ds = mnist_ds.shuffle(buffer_size=buffer_size) # 10000 as in LeNet train script mnist_ds = mnist_ds.batch(batch_size, drop_remainder=True) mnist_ds = mnist_ds.repeat(repeat_size) return mnist_dsclass LeNet5(nn.Cell): """ Lenet network Args: num_class (int): Number of classes. Default: 10. num_channel (int): Number of channels. Default: 1. Returns: Tensor, output tensor Examples: LeNet(num_class=10) """ def __init__(self, num_class=10, num_channel=1, include_top=True): super(LeNet5, self).__init__() self.conv1 = nn.Conv2d(num_channel, 6, 5, pad_mode='valid', weight_init=Normal(0.02)) self.conv2 = nn.Conv2d(6, 16, 5, pad_mode='valid', weight_init=Normal(0.02)) self.relu = nn.ReLU() self.max_pool2d = nn.MaxPool2d(kernel_size=2, stride=2) self.include_top = include_top if self.include_top: self.flatten = nn.Flatten() self.fc1 = nn.Dense(16 * 5 * 5, 120) self.fc2 = nn.Dense(120, 84) self.fc3 = nn.Dense(84, num_class) def construct(self, x): x = self.conv1(x) x = self.relu(x) x = self.max_pool2d(x) x = self.conv2(x) x = self.relu(x) x = self.max_pool2d(x) if not self.include_top: return x x = self.flatten(x) x = self.relu(self.fc1(x)) x = self.relu(self.fc2(x)) x = self.fc3(x) return xdef train_lenet(): context.set_context(mode=context.GRAPH_MODE, device_target="GPU") data_path = YOUR_DATA_PATH ds_train = create_dataset(data_path) network = LeNet5(10) net_loss = nn.SoftmaxCrossEntropyWithLogits(sparse=True, reduction="mean") net_opt = nn.Momentum(network.trainable_params(), 0.01, 0.9) time_cb = TimeMonitor(data_size=ds_train.get_dataset_size()) config_ck = CheckpointConfig(save_checkpoint_steps=1875, keep_checkpoint_max=10) ckpoint_cb = ModelCheckpoint(prefix="checkpoint_lenet", config=config_ck) model = Model(network, net_loss, net_opt, metrics={"Accuracy": Accuracy()}) summary_dir = "./summary/lenet_test2" interval_1 = [x for x in range(1, 4)] interval_2 = [x for x in range(7, 11)] ##Collector landscape information summary_collector = SummaryCollector(summary_dir, keep_default_action=True, collect_specified_data={'collect_landscape': {'landscape_size': 40, 'unit': "epoch", 'create_landscape': {'train': True, 'result': True}, 'num_samples': 512, 'intervals': [interval_1, interval_2 ] } }, collect_freq=1)在这时需要注意的是:1. callback_fn: 用户需要定义函数callback_fn,该函数没有输入,返回model(mindspore.train.Model),network(mindspore.nn.Cell),dataset(mindspore.dataset),metrics(mindspore.nn.Metrics) 。2. collect_landscape: 参数定义与SummaryCollector一致,这里用户可以自由修改绘图参数。3. device_ids: 指定地形图绘制所需要device_ids,支持单机多卡计算。4. device_target: 指定device的类型,如GPU、Ascend或CPU。 print("============== Starting Training ==============") model.train(10, ds_train, callbacks=[time_cb, ckpoint_cb, LossMonitor(), summary_collector])if __name__ == "__main__": train_lenet()summary_dir设置了参数的保存路径。summary_collector为初始化的SummaryCollector实例。其中collector_specified_data中的collect_landscape以字典的形式包含了绘制地形图所需要的所有参数设置:landscape_size: 表示地形图的分辨率。40表示地形图的分辨率是40*40。分辨率越大,地形图纹理越细致,同时计算消耗时间也会越久。unit: 表示训练过程中保存参数的间隔单位,分为epoch/step。使用step时,须在model.train中设置dataset_sink_model=False。create_landscape: 表示绘制地形图的方式,目前支持训练过程地形图(带训练轨迹)与训练结果地形图(不带轨迹)。num_samples: 表示绘制地形图数据集的样本数量。512表示地形图所需样本是512。样本数越大,地形图越精确,同时计算消耗时间也会越久。intervals: 表示绘制地形图的区间。如interval_1表示绘制带训练轨迹1-5epoch地形图。地形图绘制:利用训练过程中保存的模型参数,模型与数据集与训练一致,启动新的脚本,正向计算生成地形图信息,不用再次进行训练。(适用于单卡或多卡并行计算绘制地形图)代码如下:from mindspore.nn import Lossfrom mindspore.train.callback import SummaryLandscapedef callback_fn(): network = LeNet5(10) net_loss = nn.SoftmaxCrossEntropyWithLogits(sparse=True, reduction="mean") metrics = {"Loss": Loss()} model = Model(network, net_loss, metrics=metrics) data_path = YOUR_DATA_PATH ds_eval = create_dataset(data_path) return model, network, ds_eval, metricsif __name__ == "__main__": interval_1 = [x for x in range(1, 4)] interval_2 = [x for x in range(7, 11)] summary_landscape = SummaryLandscape('./summary/lenet_test2') # generate loss landscape summary_landscape.gen_landscapes_with_multi_process(callback_fn, collect_landscape={"landscape_size": 40, "create_landscape": {"train": True, "result": True}, "num_samples": 512, "intervals": [interval_1, interval_2 ]}, device_ids=[1, 2], device_target="GPU")————————————————原文链接:https://blog.csdn.net/JIAJIA14754545/article/details/121856840
上滑加载中
推荐直播
-
全面解析华为云EI-API服务:理论基础与实践应用指南
2024/11/29 周五 18:20-20:20
Alex 华为云学堂技术讲师
本期直播给大家带来的是理论与实践结合的华为云EI-API的服务介绍。从“主要功能,应用场景,实践案例,调用流程”四个维度来深入解析“语音交互API,文字识别API,自然语言处理API,图像识别API及图像搜索API”五大场景下API服务,同时结合实验,来加深开发者对API服务理解。
回顾中 -
企业员工、应届毕业生、在读研究生共探项目实践
2024/12/02 周一 19:00-21:00
姚圣伟 在职软件工程师 昇腾社区优秀开发者 华为云云享专家 HCDG天津地区发起人
大神带你一键了解和掌握LeakyReLU自定义算子在ONNX网络中应用和优化技巧,在线分享如何入门,以及在工作中如何结合实际项目进行学习
即将直播 -
昇腾云服务ModelArts深度解析:理论基础与实践应用指南
2024/12/03 周二 14:30-16:30
Alex 华为云学堂技术讲师
如何快速创建和部署模型,管理全周期AI工作流呢?本期直播聚焦华为昇腾云服务ModelArts一站式AI开发平台功能介绍,同时结合基于ModelArts 的实践性实验,帮助开发者从理论到实验更好地理解和使用ModelArts。
去报名
热门标签