Dynamic Channel Pruning: Feature Boosting and Suppression

使深度卷积神经网络更加精确通常是以增加计算和内存资源为代价的。在本文中,我们利用卷积层计算出的特征的重要性与输入高度相关这一事实来降低这一成本,并提出了特征提升和抑制(FBS),这是一种新的方法,可以在运行时预测放大突出的卷积通道,跳过不重要的通道.FBS将小的辅助连接引入到现有的卷积层。与永久删除通道的通道修剪方法相比,它保留了完整的网络结构,并通过动态跳过不重要的输入和输出通道来加速卷积。FBS增强网络是用传统的随机梯度下降法进行训练的,这使得它很容易为许多最先进的CNN所用。我们将FBS与一系列现有的通道修剪和动态执行方案进行比较,并展示了对ImageNet分类的巨大改进。实验表明,FBS在VGG-16和ResNet-18上分别可以节省5倍和2倍的计算量,而前5名的精度损失均小于0.6%。

1 Introduction

最先进的视觉和基于图像的任务,如图像分类(Krizhevsky等,2012;Simonyan & Zisserman,2015;He等,2016)、物体检测(Ren等,2017;Huang等,2017)和分割(Long等,2015)都建立在深度卷积神经网络(CNN)的基础上。虽然CNN架构已经发展得越来越高效,但总的趋势是使用更大的模型,以更大的内存利用率、带宽和计算需求来实现更高的精度。CNN所使用的巨大计算资源量对CNN在成本敏感的云服务和低功率边缘计算应用中的部署提出了巨大的挑战。

减少内存、带宽和计算成本的一种常见方法是修剪参数过高的CNN。如果以粗粒度的方式进行,这种方法被称为通道修剪(Ye等人,2018;He等人,2017;Liu等人,2017;Wen等人,2016)。通道修剪评估通道显著性测量,并从不重要的通道中删除所有输入和输出连接|生成一个较小的密集模型。然而,基于显著性的修剪方法有三个方面的缺点。首先,通过删除通道,CNN的能力被永久地丢失了,而且生成的CNN可能永远不会恢复其对困难输入的准确性,而这些困难输入是由被删除的通道负责的。

其次,尽管通道修剪可能会大幅缩小模型大小,但如果不经过精心设计,CNN中的计算资源无法有效减少,而不会对其准确性造成不利影响。最后,神经元的显著性并不是一成不变的,这可以通过图1中的特征可视化来说明。在这里,一个CNN显示了一组输入图像,卷积输出中的某些通道神经元可能会高度兴奋,而另一组图像则几乎没有引起相同通道的响应。这符合我们对CNN的理解,卷积层中的神经元专门识别不同的特征,一个神经元的相对重要性很大程度上取决于输入。

图1:当来自ImageNet验证数据集的图像显示给预训练的ResNet-18(He等人,2016)时,某些通道神经元的输出可能会有很大的变化。(a)和(b)中的顶行分别发现极大地激发了层块_3b/conv2的通道11和181中的神经元,而底部图像几乎没有引起相同通道神经元的激活。每个图像下面的数字表示在添加shortcut and activation之前在通道中观察到的最大值。最后,(c)显示了在前20个通道中观察到的最大激活的分布。

上述缺点促使人们提出这样一个问题:如果重要性是高度依赖于输入的,那么我们为什么要通过静态重要性进行修剪呢?当然,一个更有前途的替代方案是根据当前的输入进行动态修剪。动态通道修剪策略允许网络学习优先处理某些卷积通道,而忽略不相关的通道.与其简单地以修剪为代价减少模型大小,我们可以通过有选择地只计算运行时预测为重要的通道子集来加速卷积,同时考虑前一个卷积层的稀疏输入。实际上,一个设计良好的动态模型所使用的缓存激活量和读、写、算术操作的数量,几乎可以和一个等效稀疏的静态修剪模型完全相同。除了节省计算资源外,动态模型还保留了完整模型的所有神经元,从而将对任务精度的影响降到最低。

在本文中,我们提出了特征增强和抑制(FBS)来动态放大和抑制卷积层计算的输出通道。直观地讲,我们可以想象,在一个 "值 "的控制下,每个输出通道的信息流可以被放大或限制。这使得突出的信息可以自由流动,同时我们停止所有不重要通道的信息,跳过它们的计算。与静态的修剪不同,阀使用上一层的特征来预测输出通道的突出性。使用传统的随机梯度下降(SGD)方法,预测器可以通过观察卷积操作的输入和输出特征来学习自我调整

FBS将微小的辅助连接引入到现有的卷积层。因此,与动态稀疏性提供的潜在速度提升相比,添加到现有模型的最小开销可以忽略不计。CNN中现有的动态计算策略(Lin等人,2017;Odena等人,2017;Bolukbasi等人,2017)会产生开/关修剪决策或执行路径选择。因此,对它们的训练通常诉诸强化学习,而在实践中,强化学习的计算成本往往很高。即使FBS同样使用无差异函数,但与这些方法相反的是,用传统的SGD仍然可以很好地最小化 unified losses。

我们将FBS应用于定制的CIFAR-10(Krizhevsky等,2014)分类器和流行的CNN模型,如VGG-16(Simonyan & Zisserman,2015)和ResNet-18(He等,2016)在ImageNet数据集(Deng等,2009)上训练。实证结果表明,在同样的提速下,FBS可以产生验证精度超过本文研究的所有其他通道修剪和动态条件执行方法的模型。

2 Related Work

2.1 Structured Sparsity

自从LeCun等人(1990)引入optimal brain damag以来,通过去除连接或神经元来创建更紧凑、更有效的CNN的想法受到了极大的关注。早期关于修剪深度CNNs的文献将单个权重参数归零(Hassibi等人,1994;Guo等人,2016)。这导致了高度不规则的稀疏连接,这对于GPU来说是众所周知的难以利用的。这促使了利用稀疏权重的定制加速器解决方案(Parashar等人,2017;Han等人,2016)。虽然同时有效地支持稀疏和密集卷积,通常会在效率或性能方面做出一些妥协。

另外,最近的工作因此越来越多地关注引入结构化稀疏性(Wen等人,2016;Ye等人,2018;Alvarez & Salzmann,2016;Zhou等人,2016),这可以被GPU利用,并允许定制加速器只关注高效的密集操作。Wen等人(2016)在模型的训练损失函数中加入了对通道权重的分组Lasso。这样做的效果是降低通道权重的大小,以减少
在训练过程中,并从归零的通道中移除连接。为了促进这一过程,Alvarez & Salzmann(2016)另外使用了proximal gradient descent,而Li等人(2017)和He等人(2018a)则提出通过阈值修剪通道,即他们将不重要的通道设置为零,并对所得CNN进行微调。考虑到需要优化的大量权重,在权重组中诱导稀疏性的目标可能给基于梯度的方法带来困难。

克服这一问题的常见方法是解决(He等人,2017)或学习(Liu等人,2017;Ye等人,2018)通道显著性(channel saliencies ) 来驱动CNN的稀疏化。He等人(2017)解决了一个优化问题,该问题限制了活跃卷积通道的数量,同时使卷积输出的重建误差最小化。Liu等人(2017)在通道显著性上使用Lasso正则化来诱导稀疏性,并以全局阈值修剪通道。Ye等(2018)在批归一化中应用迭代收缩/阈值算法对缩放因子进行学习,使CNNs稀疏化。有一些方法(Luo等,2017;Zhuang等,2018)使用贪婪算法进行通道选择。Huang等人(2018)和He等人(2018b)采用强化学习来训练代理产生通道修剪决策。Figurnov等(2016)提出的PerforatedCNNs使用与模型无关的predened mask来跳过卷积层中的输出像素。

2.2 Dynamic Execution

在由结构化稀疏性方法产生的修剪模型中,被修剪的神经元和连接的能力会永久丧失。因此,许多人提出使用动态网络作为结构化稀疏性的替代方法。在推理过程中,动态网络可以使用输入数据来选择网络的部分进行评估

卷积层通常在空间上是稀疏的,即它们的激活输出可能只包含salient regions的small patches 。最近的一些方法利用这一点进行加速。Dong等人(2017)引入了low-cost collaborative layers,在廉价的卷积中诱导空间稀疏性,这样主要昂贵的卷积可以使用相同的稀疏性信息。Figurnov等(2017)提出了残差网络的空间自适应计算时间(He等,2016),它可以学习计算某个空间位置所需的残差块数。Almahairi等(2016)提出了动态容量网络,它利用粗输出的熵的梯度来选择输入图像中的突出位置进行细化。Ren等(2018)假设输入图像中存在先验的空间稀疏性,通过计算非稀疏区域来加速卷积层。

有的动态网络会对所采取的推理路径进行二元决策或多元选择。Wu等(2018)提出的BlockDrop,trains a policy network to skip blocks in residual networks。Liu & Deng(2018)提出了深度神经网络(DNNs)中的条件分支,并使用Q-learning来训练分支策略。Odena等(2017)设计了一个包含多个模块的层的DNN,并决定使用哪个模块与循环神经网络(RNN)。Lin等(2017)学习了一个RNN,在卷积层中自适应修剪通道。

这些网络中常用的开/关决策不能用可微分函数来表示,因此梯度不能很好地定义。因此,上述动态网络通过强化学习来训练其策略函数。然而,存在一些方法可以绕过这样的限制。Shazeer等(2017)引入了sparsely-gated mixture-of-experts,并在可反向传播的gating networks上使用noisy ranking来选择昂贵的专家进行评估。Bolukbasi等人(2017)训练了可微分的策略函数,在DNN中实现early exits。Hua等(2018)学习了二元策略,决定是使用部分还是所有输入通道进行卷积,但用连续的策略函数来逼近非可分化策略函数的梯度。

3 Feature Boosting and Suppression

图2:FBS卷积层的高层次视图。通过说明,我们使用具有8个通道输入和输出特征的第l层,其中通道被着色以表示不同的显著性,白色块代表全零通道。

我们先用一个高层次的图示(图2)来说明FBS如何加速具有批量归一化(BN)的卷积层。辅助组件(红色)根据输入特征预测每个输出通道的重要性,并相应放大输出特征。此外,某些输出通道被预测为完全被抑制表示为零值,这样的输出稀疏度信息可以建议卷积操作跳过这些通道的计算,如虚线箭头所示。值得注意的是,通过从输入特征和预测的输出通道显著性中跳过不活跃的通道,可以加倍加速昂贵的卷积。本节其余部分将对图2中的组件进行详细解释

3.1 Preliminaries

为了简单起见,我们考虑一个具有L个卷积层的deep sequential批归一化(Ioe & Szegedy,2015)CNN,即xL=F(x0)=fL(⋅⋅⋅f2(f1(x0))⋅⋅⋅)\mathbb x_L=F(\mathbb x_0)=f_L(\cdot\cdot\cdot f_2(f_1(\mathbb x_0))\cdot\cdot\cdot)xL​=F(x0​)=fL​(⋅⋅⋅f2​(f1​(x0​))⋅⋅⋅),其中第l层fl:RCl−1×Hl−1×Wl−1→RCl×Hl×Wlf_l:\mathbb R^{C_{l-1}\times H_{l-1}\times W_{l-1}}\rightarrow\mathbb R^{C_l\times H_l\times W_l}fl​:RCl−1​×Hl−1​×Wl−1​→RCl​×Hl​×Wl​计算特征xl∈RCl×Hl×Wl\mathbb x_l\in\mathbb R^{C_l\times H_l\times W_l}xl​∈RCl​×Hl​×Wl​。因此第 lll 层定义为:

这里(+)(+)(+)和(⋅)(\cdot)(⋅)都是element-wise的,(z)+=max(z,0)(\mathbb z)_+=max(\mathbb z,0)(z)+​=max(z,0)代表ReLu激活,γl,βl∈RCl\gamma_l,\beta_l\in\mathbb R^{C_l}γl​,βl​∈RCl​为可训练参数,norm(z)norm(\mathbb z)norm(z)在z的总体上规范化特征z的每个通道,with μz,σz2∈RCl\mu_z,\sigma_z^2\in\mathbb R^{C_l}μz​,σz2​∈RCl​分别代表总体上每个通道的均值和方差,小的ϵ\epsilonϵ是为了防止除以0。

另外,convl(xl−1,θl−1)conv_l(\mathbb x_{l-1},\theta_{l-1})convl​(xl−1​,θl−1​)对输入特征图xl−1x_{l-1}xl−1​计算带有权重张量θl∈RCl×Cl−1×k2\theta_l\in\mathbb R^{C^l\times C^{l-1}\times k^2}θl​∈RCl×Cl−1×k2的卷积操作,其中k为核大小。

具体而言,FBS涉及到convl(xl−1,θl)conv_l(\mathbb x_{l-1},\theta_l)convl​(xl−1​,θl​)函数的优化,CNN把大部分时间都花在推理上,用k2Cl−1ClHlWlk^2C_{l-1}C_lH_lW_lk2Cl−1​Cl​Hl​Wl​ multiply-accumulate operations (MACs) for the lthl^{th}lth layer.

3.2 Designing a Dynamic Layer

考虑以下对动态执行层的概括:

其中,fff和π\piπ分别用权重θ\thetaθ和ϕ\phiϕ,可能还有额外的输入,计算相同输出形状的张量,用F\mathbf FF和G\mathbf GG表示。直观地说,每当cost-effective的G[i]G^{[i]}G[i]计算为0时,任何索引 iii 都可以跳过expensive F[i]F^{[i]}F[i]。这里,上标[i]用于索引张量的第i个切片(the ithi^{th}ith slice of the tensor)。例如,如果我们有特征F∈RC×H×W\mathbf F\in\mathbb R^{C\times H\times W}F∈RC×H×W 包含C个H-by-W特征的通道,F[c]∈RH×WF^{[c]}\in\mathbb R^{H\times W}F[c]∈RH×W检索第c个特征图像。我们可以进一步对层进行稀疏化和加速,例如,在π\piπ上添加一个Lasso到总损失上,其中Ex[z]E_x[z]Ex​[z]是z相对于x的期望。

尽管这种表述很简单,然而要正确设计f^\hat ff^​是非常棘手的。在合适的条件下,我们可以通过缩放参数在保持层的输出不变的情况下,最小化Lasso。例如,low-cost collaborative layers(Dong等,2017),fff 和 π\piπ 是简单的卷积层(没有ReLU激活),参数分别为θ\thetaθ和ϕ\phiϕ。Since fff 和 π\piπ are homogeneous functions, one can always halve ϕ\phiϕ and double θ\thetaθ to decrease (4) while the network output remains the same.换句话说,最优网络必须有∥ϕ∥∞→0\parallel\phi\parallel_{\infty}\rightarrow 0∥ϕ∥∞​→0这在有限精度算法中是不可行的。基于上述原因,Dong等(2017)观察到(4)中的额外损失总是降低CNN的任务性能。Ye等(2018)指出,基于梯度的训练算法在探索这种 reparameterization patterns时效率很低,通道修剪方法也可能遇到类似的困难。Shazeer等人(2017)通过用softmax归一化整理π\piπ,避免了这一限制,但(4)不能再使用,因为softmax会使l1-norm(现在评价为1)变得无用。此外,与sigmoid相似,softmax(没有交叉熵)很容易饱和,因此可能同样遭受梯度消失的影响。许多人转而设计产生开/关决策,并通过第2节中讨论的强化学习对其进行训练。

3.3 Feature Boosting and Suppression with Channel Saliencies

最近的通道修剪方法(Liu等人,2017;Ye等人,2018)不是对特征或卷积权重参数施加稀疏性(如Wen等人(2016);Alvarez & Salzmann(2016);Li等人(2017);He等人(2018a)),而是在BN缩放因子γl\gamma_lγl​上诱导稀疏性。受他们的启发,FBS同样产生了一个channel-wise 的重要性测量。然而与他们相反的是,我们不使用恒定的BN缩放因子γl\gamma_lγl​而是预测通道重要性,并用一个依赖于前一层输出的参数函数π(xl−1)\pi(\mathbf x_{l-1})π(xl−1​)动态放大或抑制通道。在这里,我们建议将层定义fl(xl−1)f_l(\mathbf x_{l-1})fl​(xl−1​),对每个l∈[1,L]l\in[1,L]l∈[1,L]替换为f^l(xl−1)\hat f_l(\mathbf x_{l-1})f^​l​(xl−1​),采用动态通道剪枝:

其中,low-overhead策略πl(xl−1)\pi_l(\mathbf x_{l-1})πl​(xl−1​)对计算要求高的conv(xl−1,θl)conv(x_{l-1},\theta_l)conv(xl−1​,θl​)的修剪决策进行评估:

这里,wtak(z)wta_k(z)wtak​(z)是k赢家通吃的函数(k-winners-take-all function),即它返回一个与z相同的张量,只是我们将z中k个最大项,其余归零。换句话说,wta[dCl](gl(xl−1))wta_{[dC_l]}(gl(\mathbf x_{l-1}))wta[dCl​]​(gl(xl−1​))提供了一种修剪策略,只计算gl(xl−1)g_l(\mathbf x_{l-1})gl​(xl−1​)预测的[dCl][dC_l][dCl​]个最突出的通道,并抑制剩余的通道为0。在3.4节中,我们将详细解释我们如何设计一个廉价的gl(xl−1)g_l(\mathbf x_{l-1})gl​(xl−1​),它可以学习预测通道的显著性。

值得注意的是,我们的策略从第l层修剪了Cl−[dCl]C_l-[dC_l]Cl​−[dCl​]个最不突出的输出通道,其中 d∈[0,1]d\in[0,1]d∈[0,1]可以改变,以保持性能和精度之间的权衡关系。

此外,修剪后的通道包含全零值。这使得后续的(l+1)层可以轻而易举地利用输入侧的稀疏性,因为是零填充层,也可以安全地跳过全零特征。由于所有的卷积都可以同时利用输入侧和输出侧的稀疏性,因此修剪所获得的速度提升与修剪比是二次方的(quadratic)。例如,在所有层中动态修剪一半的通道,就会产生一个动态的CNN,它使用了大约1/4个原始MAC。

理论上,FBS并没有引入3.2节中讨论的reparameterization。通过对卷积输出进行批量归一化,卷积核θl\theta_lθl​对缩放不变(is invariant to scaling)。在计算上,它的训练效率更高。许多替代方法使用不微的函数π\piπ,产生开/关决策。一般来说,使用这些策略函数的DNN与SGD不兼容,并与强化学习进行训练。相比之下,(6)允许端到端训练,因为wta是像ReLU一样的可微和连续函数。Srivastava等(2015)提出,一般来说,如果一个网络使用wta这样的函数来促进许多子网络之间的局部竞争,那么对于复杂任务的训练就会更容易、更快速,也不容易出现灾难性遗忘。

3.4 Learning to Predict Channel Saliencies

本节将解释通道显著性预测器gl(xl−1)g_l(\mathbf x_{l-1})gl​(xl−1​)的设计。为了避免gl中的昂贵计算成本,我们通过使用以下函数ss:RC×H×W→RC\mathbb R^{C\times H\times W}\rightarrow\mathbb R^CRC×H×W→RC将每个通道的空间维度减少到一个标量来对xl−1x_{l-1}xl−1​进行子采样。

其中s(xl−1[c])s(\mathbf x^{[c]}_{l-1})s(xl−1[c]​)将z的第c个通道缩减为一个标量,例如,l1−norml^1-norml1−norm ∥xl−1[c]∥1\parallel\mathbb x^{[c]}_{l-1}\parallel_1∥xl−1[c]​∥1​,l2−norml^2-norml2−norm,l∞−norml^{\infty}-norml∞−norm或者xl−1[c]\mathbb x_{l-1}^{[c]}xl−1[c]​的方差。第4节的结果默认使用l1-norm,等价于xl−1\mathbb x_{l-1}xl−1​的ReLU激活的全局平均池化。

然后我们在子采样激活ss(xl−1)ss(\mathbb x_{l-1})ss(xl−1​)设计全连接层gl(xl−1)g_l(\mathbb x_{l-1})gl​(xl−1​)来预测通道显著性,其中ϕ∈RCl×Cl−1\phi\in\mathbb R^{C^l\times C^{l-1}}ϕ∈RCl×Cl−1是层的权重张量:

[

我们把ρl\rho_lρl​初始化为1并应用He等(2015)的初始化方法初始化ϕl\phi_lϕl​。与Liu等人(2017)和Ye等人(2018)如何在BN缩放因子中诱导稀疏性相似,我们在gl(xl−1)g_l(\mathbb x_{l-1})gl​(xl−1​)上用Lasso正则化所有层:λΣl=1LEx[∥gl(xl−1)∥1]\lambda\Sigma_{l=1}^L\mathbb E_{\mathbb x}[\parallel gl(\mathbb x_{l-1})\parallel_1]λΣl=1L​Ex​[∥gl(xl−1​)∥1​] in the total loss,

用Lasso正则化所有层:λΣl=1LEx[∥gl(xl−1)∥1]\lambda\Sigma_{l=1}^L\mathbb E_{\mathbb x}[\parallel gl(\mathbb x_{l-1})\parallel_1]λΣl=1L​Ex​[∥gl(xl−1​)∥1​] in the total loss,

where λ=10−8\lambda=10^{-8}λ=10−8 in our experiments.

Dynamic Channel Pruning Feature Boosting and Suppression相关推荐

  1. 【模型压缩】Channel Pruning for Accelerating Very Deep Neural Networks算法笔记

    转:https://blog.csdn.net/u014380165/article/details/79811779 论文:Channel Pruning for Accelerating Very ...

  2. Channel Pruning for Accelerating Very Deep Neural Networks

    Channel Pruning for Accelerating Very Deep Neural Networks ######################################### ...

  3. 论文笔记 | DCS-RISR: Dynamic Channel Splitting for Efficient Real-world Image Super-Resolution

    论文笔记 | DCS-RISR: Dynamic Channel Splitting for Efficient Real-world Image Super-Resolution 太久没更新了,因为 ...

  4. 《Channel Pruning for Accelerating Very Deep Neural Networks》论文笔记

    1. 概述 这篇文章提出了一种基于LASSO回归的通道选择和最小二乘重构的迭代两步算法,有效地对每一层进行修剪.并进一步将其推广到多层和多分枝的场景下.论文中的方法能够减少累积误差并且提升对于不同结构 ...

  5. 深度学习每层的通道数如何计算_模型通道剪枝之DMCP: Differentiable Markov Channel Pruning...

    模型压缩的目的是减小模型计算量(FLOPs or MACC).减小模型参数量/体积.减小模型的推理时间(latency).主要方法有知识蒸馏.紧凑网络设计.剪枝.量化.低秩近似等.今天分享一篇通道剪枝 ...

  6. 【ACCV2022】论文阅读笔记Lightweight Alpha Matting Network Using Distillation-Based Channel Pruning

    Lightweight Alpha Matting Network Using Distillation-Based Channel Pruning 使用基于蒸馏通道裁剪的轻量Alpha抠图网络 ht ...

  7. Deep learning based multi-scale channel compression feature surface defect detection system

    基于深度学习的多尺度通道压缩特征表面缺陷检测系统 Deep learning based multi-scale channel compression feature surface defect ...

  8. Rethinking the Smaller-Norm-Less-Informative Assumption in Channel Pruning of Convolution Layers简记

    Rethinking the Smaller-Norm-Less-Informative Assumption in Channel Pruning of Convolution Layers简记 文 ...

  9. Lossless CNN Channel Pruning via Decoupling Remembering and Forgetting

    摘要 我们提出了一种新的无损通道修剪方法ResRep(又称滤波器修剪),它旨在通过减少卷积层的宽度(输出通道的数量)来精简卷积神经网络(CNN).受关于记忆和遗忘独立性的神经生物学研究的启发,我们提出 ...

最新文章

  1. 全景照片不怕歪!Facebook 用神经网络矫正扭曲的地平线
  2. img disabled可以用什么替代_本特:马内不可替代,菲米是粘合剂,萨拉赫可以用姆巴佩桑乔替代...
  3. 一文看懂大数据领域的六年巨变
  4. 构建指定仓库_使用Travis CI自动构建和部署你的GitBook
  5. 20165328 第八周学习总结
  6. hdoj1465错排公式的应用(递推)
  7. HttpServlet介绍
  8. 线性回归的 拟合优度R^2 与 相关系数
  9. 南财计算机专业学科评估,江苏软件工程专业大学排名:江苏哪些大学软件工程比较好?...
  10. java chm文件解析_Java 解析chm文件实战(原创)
  11. 电气simulink常用模块_支持PLC编程的5大电气语言,你会几种?
  12. 效率工具 Snipaste、坚果云、印象笔记
  13. 基于Cesium的火箭发射演示
  14. c标准库头文件ctype.h详解
  15. 如何修改Bash Shell的提示符的格式和配色
  16. 448. Find All Numbers Disappeared in an Array(找到所有数组中消失的数字)
  17. python中怎样在图片上画线段_python 实现PIL模块在图片画线写字
  18. python dataframe索引筛选_python-Pandas DataFrame:查找两列相等/相同的特定长度序列的索引值...
  19. 知乎上一句话几万赞的神回复
  20. 对规模区域消防给水系统的探讨

热门文章

  1. opencv 二值化 matlab,opencv-python图像二值化函数cv2.threshold函数详解及参数cv2.THRESH...
  2. 边工作边考研,最需要注意的事项和经验教训 - 我的在职考研之路
  3. 【华人学者风采】朱道本 中国科学院
  4. “4.29”赛事再燃“360春秋杯”国际挑战赛报名启动
  5. python海象运算符怎么用_python中的海象运算符
  6. 搭建Paas-------单节点安装Docker
  7. 2018年总结:你是我最想靠近的温柔
  8. Rocksdb Flush
  9. nodejs爬虫与php爬虫,nodejs爬虫初试superagent和cheerio
  10. 货运APP产品魔力=卓越功能×情感诉求