【论文阅读】Learning Efficient Convolutional Networks through Network Slimming

2023-11-04

1,论文和代码

https://arxiv.org/abs/1708.06519
https://github.com/Eric-mingjie/network-slimming

1,摘要
    深度卷积神经网络(CNNs)在许多现实应用中的部署很大程度上受到其高计算成本的阻碍。在这篇论文中,我们提出了一种新的训练方法,可以:
  1)缩小模型尺寸;
  2)减少运行时的内存占用;
  3)在不影响精度的前提下,降低计算操作的数量。
这是通过一种简单而有效的方式在网络中增强信道级稀疏性来实现的。与现有的许多方法不同,本文提出的方法直接应用于常用的CNN架构,将训练过程的开销最小化,生成的模型不需要特殊的软件/硬件加速器。我们称我们的方法为网络瘦身,它以大而宽的网络作为输入模型,但在训练过程中,不显著的通道会被自动识别和修剪,从而产生具有同等精度的瘦而紧凑的模型。我们用几个最先进的CNN模型,包括VGGNet, ResNet和DenseNet, onvariousimageclassificationdatasets,实证地证明了我们的方法的有效性。对于VGGNet,一个多通道的网络瘦身版本在模型尺寸上减少了20倍,在计算操作上减少了5倍。

1,引言
    近年来,卷积神经网络(CNNs)已经成为各种计算机视觉任务的主导手段,如图像分类[22]、目标检测[8]、语义分割[26]。大规模的数据集,高端的现代gpu和新的网络架构允许开发前所未有的大型CNN模型。例如,从AlexNet[22]、VGGNet[31]、GoogleNet[34]到ResNets [14], ImageNet分类挑战书的获奖模型已经从8层发展到超过100层。
    然而,更大的cnn虽然具有更强的代表性,但更需要资源。例如,一个152层的ResNet[14]有超过6000万个参数,在推断分辨率为224×的图像时需要超过20千兆浮点运算(FLOPs)224这在资源受限的平台(如移动设备、可穿戴设备或物联网(IoT)设备上不太可能负担得起。

    CNN在实际应用中的部署主要受以下限制:
1) 模型尺寸:CNNs强大的表现力来自其数百万个可训练参数。这些参数以及网络结构信息需要存储在磁盘上,并在推理期间加载到内存中。例如,存储一个典型的在ImageNet上训练的CNN会占用超过300MB的空间,这对于嵌入式设备来说是一个很大的资源负担。
2) 运行时内存:在推理期间,CNN的中间激活/响应甚至比存储模型参数占用更多的内存空间,即使批量大小为1。这对高端gpu来说不是问题,但对于许多低计算能力的应用来说,这是无法承受的。
3) 计算操作的数量:卷积运算在高分辨率图像上是计算密集型的。一个大型的CNN在移动设备上处理一个单一的图像可能需要几分钟的时间,这使得将其用于实际应用是不现实的。
    许多工作已经被提出压缩大型CNN或直接学习更有效的CNN模型以进行快速推理。这些方法包括低秩近似[7]、网络量化[3,12]和二值化[28,6]、权重剪枝[12]、动态推理[16]等。然而,大多数这些方法只能解决上述一个或两个挑战。此外,有些技术需要专门设计的软件/硬件加速器来加速执行[28,6,12]。
    降低大型cnn资源消耗的另一个方向是网络稀疏化。稀疏性可以应用于不同层次的结构[2,37,35,29,25],这会产生相当大的模型尺寸压缩和推理速度。然而,这些方法通常需要特殊的软件/硬件加速器来获得内存增益或节省时间,尽管它比[12]中的非结构化稀疏权重矩阵更容易。
    在本文中,我们提出了一种简单而有效的网络训练方案,它解决了在有限资源下部署大型cnn时所面临的所有挑战。我们的方法在批处理规范化(BN)层中对比例因子进行L1正则化,因此在不改变现有CNN结构的情况下易于实现。通过L1正则化将BN标度因子的值推向零,可以识别不重要的通道(或神经元),因为每个比例因子对应于一个特定的卷积通道(或完全连接层中的神经元)。这有助于在接下来的步骤中进行通道级别的修剪。附加的正则化项很少影响性能。实际上,在某些情况下,它会导致更高的泛化精度。修剪不重要的通道有时可能会暂时降低性能,但是这种影响可以通过对修剪后的网络进行后续的微调来补偿。经过修剪后,与初始的宽网络相比,在模型大小、运行时内存和计算操作方面,窄网络要紧凑得多。上述过程可以重复多次,得到一个多通道网络精简方案,从而使网络更加紧凑。
    实验结果表明,在获得与原模型相同甚至更高精度的条件下,可以获得比原模型高20倍的模式尺寸压缩和5倍的运算量缩减的CNN模型。此外,我们的方法使用传统的硬件和深度学习软件包实现了模型压缩和推理的加速,因为得到的更窄的模型不需要任何稀疏的存储格式或计算操作。
在这里插入图片描述
图1:我们将比例因子(从批处理规范化层重用)与卷积层中的每个通道相关联。稀疏性在训练过程中对这些缩放因子进行正则化,以自动识别不重要的通道。小通道缩放因子值(橙色)将被修剪(左侧)。剪枝后,我们得到了紧凑模型(右侧),然后微调以达到与正常训练的全网络相当(甚至更高)的精度。

2,相关工作
在本节中,我们讨论了五个方面的相关工作。
    低秩分解利用奇异值分解(SVD)等技术,用低秩矩阵逼近神经网络中的权值矩阵[7]。这种方法特别适用于完全连接的层,产生∼3倍的模型尺寸压缩,但是没有显著的速度加速,因为CNN中的计算操作主要来自卷积层。
    权重量化。HashNet[3]提出量化网络权值。在训练之前,网络权值被散列到不同的组中,每个组的权值被共享。这样只需要存储共享权重和哈希索引,就可以节省大量的存储空间。[12] 在深度压缩管道中使用改进的量化技术,在AlexNet和VGGNet上实现35到49倍的压缩率。然而,这些技术既不能节省运行时内存,也不能节省推理时间,因为在推理过程中,需要将共享权重恢复到其原始位置。
    [28,6]将实值权重量化为二元/三元权重(权重值限制为{−1,1}或{1,0,1})。这样可以节省大量的模型尺寸,并且在给定按位运算库的情况下,也可以获得显著的加速。然而,这种激进的低位近似方法通常会带来中等精度的损失。
    重量修剪/稀疏化。[12] 提出在训练后的神经网络中用小权值剪除不重要的连接。由此得到的网络权值大多为零,因此可以通过稀疏格式存储模型来减少存储空间。然而,这些方法只能通过专用稀疏矩阵运算库和/或硬件来实现加速。运行时内存节省也非常有限,因为大部分内存空间被激活映射(仍然密集)而不是权重消耗。
    在[12]中,训练过程中没有对稀疏性的指导。[32]通过使用额外的门变量显式地对每个权重施加稀疏约束来克服这一限制,并通过使用零门值修剪连接来实现高压缩率。这种方法比[12]有更好的压缩率,但也有同样的缺点。
    结构化修剪/稀疏化。最近,[23]提出在经过训练的cnn中对输入权值较小的信道进行剪枝,然后对网络进行微调以恢复精度。[2] 通过在训练前随机地去激活卷积层中的输入输出信道连接来引入稀疏性,这也会产生较小的网络和中等的精度损失。与这些工作相比,我们在训练过程中明确地在优化目标中加入信道稀疏性,使得信道修剪过程更加平滑,精度损失很小。
    [37]在训练过程中使神经元水平稀疏,因此可以对一些神经元进行修剪以获得紧凑的网络。[35]提出了一种结构化稀疏学习(SSL)方法来稀疏化CNNs中不同层次的结构(如滤波器、信道或层)。两种方法都是在训练过程中利用群体稀疏性调节来获得结构化稀疏度。我们的方法不依赖于卷积权值的群稀疏性,而是对信道尺度因子施加简单的L1稀疏性,因此优化目标要简单得多。
    由于这些方法对网络结构(例如,神经元、通道)的一部分进行修剪或稀疏化,而不是单个权重,因此它们通常需要较少的专用库(例如用于稀疏计算操作)来实现推理加速和运行时内存节省。我们的网络瘦身也属于这一类,完全不需要专门的图书馆来获得好处。
    神经结构学习。虽然最先进的cnn通常是由专家设计的[22,31,14],但是对于网络体系结构的自动学习也有一些探索。[20] 在给定资源预算的情况下,引入子模块/超模优化网络结构搜索。最近的一些工作[38,1]提出用强化学习来自动学习神经结构。这些方法的搜索空间非常大,需要训练成百上千的模型来区分好坏。网络瘦身也可以被视为一种架构学习的方法,尽管选择是有限的每一层的宽度。然而,与上述方法不同的是,网络瘦身只通过单一的训练过程来学习网络结构,这符合我们的效率目标。

3,网络瘦身
我们的目的是提供一个简单的方案来实现深CNN的信道级稀疏性。在本节中,我们首先讨论信道级稀疏性的优点和挑战,并介绍如何利用批量规范化中的缩放层来有效地识别和修剪网络中不重要的信道。
    信道级稀疏性的优点。正如先前的工作[35,23,11]中所讨论的,稀疏性可以在不同的层次上实现,例如,权重级、内核级、信道级或层级。细粒度级别(例如,权重级别)稀疏性提供了最高的灵活性,通用性导致更高的灵活性压缩率,但通常需要特殊的软件或硬件加速器来对稀疏模型进行快速推断[11]。相反,最粗层的稀疏性不需要特殊的包来获得推理加速,但由于某些整层需要修剪,它的灵活性较差。事实上,只有当深度足够大时,移除层才有效,例如超过50层[35,18]。相比之下,信道级稀疏性在灵活性和易实现性之间提供了一个很好的折衷方案。它可以应用于任何典型的CNN或完全连接的网络(将每个神经元视为一个通道),所得到的网络本质上是未运行网络的“精简”版本,可以在传统的CNN平台上有效地推断出来。
    挑战。实现信道级稀疏性需要修剪与信道相关联的所有入站和出站连接。这使得在预先训练的模型上直接剪枝权值的方法无效,因为在一个通道恰好有接近零的值。如文献[23]所述,在预先训练的resnet上修剪信道只会导致参数数量减少∼10%,而不会造成精度损失。[35]通过在训练目标中实施稀疏正则化来解决这个问题。具体地说,在训练过程中,采用群套索将同一通道对应的所有滤波器权值同时推向零。然而,这种方法需要计算附加正则化项相对于所有滤波器权重的梯度,这是非常重要的。我们引入一个简单的想法来解决上述问题挑战,详情如下。
    标度因子和稀疏诱导惩罚。我们的想法是为每个通道引入一个比例因子γ,乘以该通道的输出。然后我们联合训练网络权值和这些尺度因子,并对后者施加稀疏正则化。最后用小因子对这些信道进行剪枝,并对修剪后的网络进行微调。具体来说,我们方法的训练目标是
在这里插入图片描述
其中(x,y)表示训练输入和目标,W表示可训练权重,第一个和项对应于CNN的正常训练损失,g(·)是稀疏性引起的比例因子惩罚,λ平衡这两个项。在我们的实验中,我们选择g(s)=| s |,它被称为L1范数,被广泛用于实现稀疏性。对于non-smooth L1惩罚项,采用次梯度下降作为优化方法。另一种选择是替换L1惩罚与smooth-L1惩罚[30]以避免在非平滑点使用次梯度。
    由于修剪一个信道本质上相当于删除该信道的所有入站和出站连接,所以我们可以直接获得一个狭窄的网络(见图1),而无需借助任何特殊的稀疏计算包。比例因子作为信道选择的代理。当它们与网络权值联合优化时,网络可以自动识别出不重要的信道,这些信道可以安全地被移除而不需要很大的代价影响泛化性能。
在这里插入图片描述
    图2:网络瘦身流程图。点划线用于多程/迭代方案。
    利用BN层中的比例因子。批处理规范化[19]已被大多数现代CNNs作为标准方法来实现快速收敛和更好的泛化性能。BN规范化激活的方法激励我们设计一个简单高效的方法合并信道比例因子。特别是,BN层使用小批量统计来规范内部激活。设z in和z out为BN层的输入和输出,B表示当前的小批量,BN层执行以下转换:
在这里插入图片描述其中,µB和σB是B上输入激活的平均值和标准差值,γ和β是可训练的仿射变换参数(尺度和位移),它提供了将归一化激活线性转换回任何尺度的可能性。
    通常的做法是在卷积层之后插入一个BN层,并带有信道方向的缩放/移位参数。因此,我们可以直接利用BN层中的γ参数作为网络精简所需的缩放因子。它的最大优点是不会给网络带来任何开销。事实上,这也许也是我们学习信道修剪的最有效的方法。1) 如果我们在没有BN层的CNN中添加缩放层,则由于卷积层和缩放层都是线性变换,因此缩放因子的值对于评估信道的重要性没有意义。通过减小比例因子值,同时放大卷积层中的权重,可以获得相同的结果。2) 如果在BN层之前插入一个标度层,则标度层的标度效应将被BN中的归一化过程完全消除。3) ,如果我们在BN层之后插入缩放层,则每个通道有两个连续的缩放因子。
    通道修剪和微调。在信道级稀疏诱导正则化下进行训练后,我们得到一个模型,其中许多比例因子接近于零(见图1)。然后,我们可以通过移除所有传入和传出连接以及相应的权重来修剪具有接近零缩放因子的通道。我们在所有层上使用全局阈值来修剪通道,该阈值被定义为所有缩放因子值的某个百分比。例如,我们通过选择百分位阈值为70%来修剪具有较低缩放因子的70%通道。通过这样做,我们获得了一个更紧凑的网络,具有更少的参数和运行时内存,以及更少的计算操作。
    当剪枝率较高时,剪枝可能会暂时导致某些精度损失。但这在很大程度上可以通过对修剪后的网络进行微调来补偿。在我们的实验中,在许多情况下,微调的窄网络甚至可以达到比原始未运行网络更高的精度。

    多通方案。我们还可以将所提出的方法从单通学习模式(稀疏正则化训练、剪枝和微调)扩展到多程学习模式。具体来说,一个网络瘦身过程会导致一个狭窄的网络,在这个网络上我们可以再次应用整个训练过程来学习一个更紧凑的模型。图2中的虚线说明了这一点。实验结果表明,这种多通路方案可以有效地提高药物的利用率以获得更好的压缩率。
    处理跨层连接和预激活结构。上面介绍的网络精简过程可以直接应用于大多数普通的CNN架构,如AlexNet[22]和VGGNet[31]。当它应用于具有跨层连接的现代网络和预激活设计(如ResNet[15]和DenseNet[17])时,需要进行一些调整。对于这些网络,一个层的输出可以被视为多个后续层的输入,其中BN层被放置在卷积层之前。在这种情况下,稀疏性在层的输入端实现,即,该层选择性地使用它接收到的信道的子集。为了在测试时获得参数和节省的计算量,我们需要放置通道选择层以遮罩不重要的我们已经确定的渠道。

4,实验结果
在这里插入图片描述
    表1:CIFAR和SVHN数据集的结果。“基线”表示没有稀疏正则化的正常训练。在第1列中,“60%修剪”表示从稀疏训练的模型中剪除60%通道的微调模型。参数的修剪比率第4列和第6列也显示了失败。适当地修剪40%的通道可以大大降低测试误差。准确度通常可以保持在≥60%的通道修剪。

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

【论文阅读】Learning Efficient Convolutional Networks through Network Slimming 的相关文章

  • Qt应用程序设计(二):窗口与部件

    一 部件基类继承表 二 窗口部件QWidget 1 窗口与子部件 窗口部件 Widget 简称部件 是Qt中建立用户界面的主要元素 像主窗口 对话框 标签 按钮 文本输入框等都是窗口部件 这些部件可以接受用户输入 显示数据和状态信息 并且在
  • Qt中出现错误:Cannot find Makefile. Check your build settings.

    错误 Cannot find Makefile Check your build settings Error while building deploying project untitled1 kit Desktop Qt 5 14 1
  • __attribute__((visibility(“default“)))含义

    GCC的visibility属性用来控制 so文件的符号表 也就是控制外部能不能找到符号调用 比如函数 变量 模板 类等 符号表分静态的 symtab 和动态的 dynsym 一个对应链接视图另一个对应执行视图 设置为 hidden 符号将
  • 卷积神经网络中的即插即用模块

    卷积神经网络中的即插即用模块 是首发于GiantPandaCV公众号的电子书教程 由pprp总结并整理了常见的即插即用模块 可以分为注意力模块和其他模块 通过这篇电子书中的模块结合 从零开始学习YOLOv3 中的在YOLOv3模型中添加At
  • L3-018 森森美图 (30 分)

    题目 题目链接 题解 BFS 先看看样例咋出来的吧 判断某个坐标属于起点终点连线的哪一侧的时候 我们采用是将点代入起点终点的两点式中根据正负值判断 两次bfs更新起点到终点的 距离 bfs每次扩展一个点 用起点到该点的 距离 更新其八个方向
  • 详解Java中native方法的使用

    和C联合开发的时候用的是Native 用native关键字说明这个方法是一个原生函数 即这个方法用C C语言实现 编译成一个DLL 由java调用 本文介绍了java中native方法的使用 有兴趣的朋友来看看吧 今天在网上学习的时候 碰到
  • 计算机毕设大作业《基于SpringBoot的实验室管理系统》

    项目背景 社会的发展和科学技术的进步 互联网技术越来越受欢迎 网络计算机的生活方式逐渐受到广大人民群众的喜爱 也逐渐进入了每个用户的使用 互联网具有便利性 速度快 效率高 成本低等优点 因此 构建符合自己要求的操作系统是非常有意义的 本文从
  • mysql数据库基本知识

    本篇笔记主要是总结整理mysql数据库基本知识 需要掌握的主要包括通过信息 gt 画出ER图 gt 由ER图创建数据库表 sql语句 1 概念模型 ER图 图片修改为 2 用sql语句 实现增删查改建等操作 1 建 CREATE TABLE
  • python float转str_python 数据类型互相转换

    关注本号 教你更多python知识 python中 有6种数据类型 那它们之间能不能互相转换 怎样转换 这篇就来说说 数据类型之间的转换 数据类型之间的转换 主要有以下函数 1int 将其它类型转为整型 int x 0 gt integer
  • centos7 下载安装pycharm以及破解

    下载 wget P root opt https download jetbrains com python pycharm professional 2019 1 3 tar gz 解压 cd root opt tar xzvf pych
  • 前端---【nodejs的介绍与Buffer缓冲器的介绍】

    目录 一 node js的介绍 1 1node js是什么 1 2node js的作用 二 运行node js文件 三 buffer 缓冲器 3 1 buffer介绍 3 2特点 3 3创建Buffer的四种方式 3 1创建Buffer第一
  • virt-install: 未找到命令...

    root localhost t virt install bash virt install 未找到命令 yum install libguestfs tools yum install virt install noarch
  • blender简单骨骼绑定

    blender2 90 1 设置3D游标 shift 鼠标右键设置到想要的位置 或者设置到原点 shift s gt Cursor to world origin 或者shift c 2 创建测试的物体 一个长方形 shift a mesh
  • 《UnityAPI.AnimatorStateInfo动画器状态信息》(Yanlz+Unity+SteamVR+云技术+5G+AI+VR云游戏+IsName+IsTag+tag+立钻哥哥++OK++)

    UnityAPI AnimatorStateInfo动画器状态信息 版本 作者 参与者 完成日期 备注 UnityAPI AnimatorStateInfo V01 1 0 严立钻 2020 07 02 UnityAPI AnimatorS
  • 数据结构-链栈的c++实现

    pragma once ifndef My Head H define My Head H include G code c myhead h endif My Head H template
  • 远心镜头的区别

    文章预览 前言 Introduction 物方远心镜头 Object Space Telecentric 像方远心镜头 Image Space Telecentric 双侧远心镜头 Bi Telecentric 总结 Summary 前言

随机推荐

  • Python VTK 球体贴图代码详解(二)

    效果 继昨天的柱体代码学习 之后尝试了一把球体并进行贴图 效果如下 代码 代码是在昨天柱体基础上修改成球体 并针对球体贴图多了两步 import vtk 柱体 生成一个球体 sphere vtk vtkSphereSource 半径 sph
  • 主动运维管理摆脱“救火式”运维局面

    云呐运维管理模块是以服务目录的形式提供IT服务的交付 用户可点击服务目录中的服务 创建请求流程 通过服务门户汇总所有服务请求 事件 问题 变更记录 分派服务任务 监督执行情况全面管控事件的生命周期 支持事件升级策略定义 提高运维人员的效率
  • Linux 中宝塔面板的 tomcat 重启弹窗一闪而过,但是并未启动tomcat的问题

    这几天不知道是项目出错的原因还是其他因素 我在部署项目的时候 好像在宝塔的tomcat管理界面 点击了停止 我本想暂停tomcat服务 之后想再次开启的时候 tomcat 的重启按钮 一点 基本就是瞬间成功 这肯定有问题 一般来说tomca
  • 高校软件工程期末复习——ICONIX

    ch01 软件工程危机 定义 软件在开发和维护过程中遇到的一系列严重的问题 含义 如何开发软件 如何维护数量不断膨胀的已有软件 原因 客户对软件需求的描述不精确 可能有遗漏 有二义性 有错误 在软件开发过程中 用户提出修改软件功能 界面 支
  • Cookie和Session是什么?它们的区别是什么?

    什么是Cookie Cookie实际上是一小段的文本信息 客户端请求服务器 如果服务器需要记录该用户状态 就使用response向客户端浏览器颁发一个Cookie 客户端会把Cookie保存起来 当浏览器再请求该网站时 浏览器把请求的网址连
  • 谷歌浏览器报错:NET::ERR_CERT_AUTHORITY_INVALID

    chrome net internals hsts
  • Vivado使用心得(六)Vivado ILA观察信号和调试过程

    先简单介绍一下ILA Integrated Logic Analyzer 生成方法 这里有两种办法完成Debug Core的配置和实现 方法一 mark debug综合选项 Set Up Debug设定ILA参数 1 在信号 reg或者wi
  • MV-YOLO翻译(2018年5月 CVPR论文)【原创】

    声明 作者翻译论文仅为学习 如有侵权请联系作者删除博文 谢谢 另 如有不当的地方 请各位大佬批评指正 谢谢 MV YOLO 通过语义目标检测实现运动矢量跟踪 原论文pdf下载地址 https arxiv org pdf 1805 00107
  • office2010 错误1706 解决办法

    office2010 错误1706 解决办法 问题描述 1 弹窗 无限弹窗 无限 困扰了我大概半年的问题 自从上次不小心删掉一些有关office2010的东西 导致网页中下载东西后总是弹窗 office2010 卸载出现 安装程序找不到Pr
  • 以太坊微支付通道原理与实现

    以太坊微支付通道原理与实现 线上直接转账需要一定的费用 如果存在大量小额交易的情况下 费用会变的难以承受 因而以太坊引入了微交易支付通道来解决这个问题 以太坊提供了一个票据支付方案 主要依赖于智能合约实现的一对多的账单系统 该账单系统大致上
  • 【超级无敌详细的韩顺平java笔记】从入门到精通---基本数据类型的转换

    1 自动类型转换 当Java程序在进行赋值或运算时 精度小的类型自动转换为精度大的数据类型 这个就是自动类型转换 数据类型按照精度 容量 大小排序为 注意和细节 1 有多种类型的数据混合运算时 系统首先自动将所有数据转换成容量最大的那种数据
  • kafka 配置部署

    本文以部署三台kafka broker 为例讲解 kafka版本为 kafka 2 9 2 0 8 1 1 运行环境为centos jdk版本为1 7以上 kafka依赖zookeeper 部署之前部署好zookeeper集群 1 获取ka
  • Linux中操作sqlite3、sqlite3数据c/c++接口编程与Windows和Linux中sqlite3库的制作(SQLite二)

    目录 一 linux操作sqlite3 1 可以像window下通过qtcreator编译 2 可以用gcc直接编译 1 要安装libreadline dev 2 在工程文件中添加 3 打开shell c 在最前面添加一行代码 3 直接用U
  • .net线程同步

    大家都晓得 NET中线程同步有以下几种方式 临界区 Critical Section 互斥量 Mutex 信号量 Semaphore 事件 Event 1 临界区 通过对多线程的串行化来访问公共资源或一段代码 速度快 适合控制数据访问 在任
  • element-ui的表单验证及自定义验证规则

    element ui是一个组件库 里面有很多项大家都会用到 其中的表单项验证时比较常用的 比如我们一个登录界面有以下的要求 手机号 必填 11位移动手机号 验证码 必填 6位数字 协议 必须勾选
  • 【NoteExpress】技巧与Error解决方案

    Error 插入文献出现 OLE error 800A01A8错 错误原因 未在源word wps文件插入文献时报错 解决方案 检查是否在源word wps文件中进行操作 点击 去除格式化 分别进行去除格式化 清除域代码操作 导入文献 出现
  • Java连接数据库(二):数据库连接池(druid)

    背景 每次使用SQL语句操作数据库的时候都需要创建一个与数据库的连接 使用完之后再把这个连接销毁掉 这种频繁创建与销毁比较耗费机器的性能跟资源 也没有太大意义 数据库连接可以解决该问题 备注 建立一个数据库连接是一件非常耗时 消耗时间 耗力
  • vue获取上传文件路径_VUE上传文件夹的三种解决方案

    1 背景 用户本地有一份txt或者csv文件 无论是从业务数据库导出 还是其他途径获取 当需要使用蚂蚁的大数据分析工具进行数据加工 挖掘和共创应用的时候 首先要将本地文件上传至ODPS 普通的小文件通过浏览器上传至服务器 做一层中转便可以实
  • 详解Arduino Uno开发板的引脚分配图及定义

    详解Arduino Uno开发板的引脚分配图及定义 在本篇文章中 我们将详细介绍Arduino开发板的硬件电路部分 具体来说 就是介绍Arduino Uno开发板的引脚分配图及定义 Arduino Uno微控制器采用的是Atmel的ATme
  • 【论文阅读】Learning Efficient Convolutional Networks through Network Slimming

    1 论文和代码 https arxiv org abs 1708 06519 https github com Eric mingjie network slimming 1 摘要 深度卷积神经网络 CNNs 在许多现实应用中的部署很大程度