第七章:自动调整的深度神经网络

摘要

AutoML 的最新进展产生了可以与机器学习专家在监督学习任务上竞争的自动化工具。在这项工作中,我们介绍了两个版本的 Auto-Net ,它们提供了自动调整的深度神经网络,而无需任何人工干预。第一个版本是 Auto-Net 1.0,它使用贝叶斯优化方法 SMAC,基于屡获殊荣的系统 Auto-sklearn 的思想,并使用 Lasagne 作为基础深度学习(DL)库。最新的 Auto-Net 2.0 建立在贝叶斯优化和 HyperBand 的最新组合(称为 BOHB)的基础上,并使用 PyTorch 作为 DL 库。据我们所知,Auto-Net 1.0 是第一个自动调整的神经网络,能够在竞赛数据集上赢得人类专家(这是第一个 AutoML 挑战的一部分)。进一步的经验结果表明,将 Auto-Net 1.0 与 Auto-sklearn 组合在一起可以比任何其他方法都具有更好的性能,而 Auto-Net 2.0 具有更好的性能。

简介

近年来,神经网络极大地改善了各种基准,并开辟了许多新的有前途的研究途径[22,27,36,39,41]。但是,神经网络对于非专业人士来说并不容易使用,因为神经网络的性能关键取决于大量超参数集(例如学习率和权重衰减)和架构选择(例如层数和激活函数类型)的正确设置。在这里,我们展示了基于自动化机器学习(AutoML)方法的神经网络现成有效工作。

AutoML 旨在为专家和非专家提供有效的现成的学习系统,使他们免于为手头的数据集选择正确的算法的繁琐而费时的任务,以及选择正确的预处理方法和所有相关组件的各种超参数。 Thornton等[43] 将这个 AutoML 问题描述为算法选择和超参数优化(CASH)的组合问题,旨在识别算法组件与最佳(交叉)验证性能的组合。

解决此 CASH 问题的一种有效方法将这种交叉验证性能视为昂贵的黑盒函数,并使用贝叶斯优化 [4,35]来搜索其优化程序。尽管贝叶斯优化通常使用高过程 (GP) [32],但这往往会遇到 CASH 问题的特殊特点(高维;分类和连续超参数;许多条件超参数,它们仅与其他超参数的某些实例相关)。使 GP 适应这些特征是一个活跃的研究领域[40,44],但是到目前为止,使用基于树模型的贝叶斯优化方法[2,17]在 CASH 设置 [9,43]中取得的效果最好。

Auto-Net 是在第 4 章和第 6 章中讨论的两个著名的 AutoML 系统 Auto-WEKA [43] 和 Auto-sklearn [11] 之后建模的。两者都使用基于随机森林的贝叶斯优化方法 SMAC [17] 来解决 CASH 问题–分别在 WEKA [16] 和 scikit-learn [30] 中找到分类器的最佳实例。Auto-sklearn 采用了两种其他方法来提高性能。首先,它使用基于先前数据集经验的元学习[3]从良好的配置[12]启动 SMAC 。其次,由于最终目标是做出最佳预测,因此尝试数十种机器学习模型,然后仅使用单个最佳模型是浪费资源;而 Auto-sklearn 保存了所有由 SMAC 评估的模型,并使用集成选择技术构建了这些模型[5]的集成。即使 Auto-WEKA 和 Auto-sklearn 都包含广泛的监督学习方法,但都没有包含现代神经网络。

在这里,我们介绍两个我们称其为 Auto-Net 系统的版本,来填补这一空白。Auto-Net 1.0 基于 Theano ,并且具有相对简单的搜索空间,而最新的 Auto-Net 2.0 是在 PyTorch 上实现的,并使用了更复杂的空间和 DL 方面的最新进展。进一步的区别在于它们各自的搜索过程:Auto-Net 1.0 使用与 Auto-WEKA 和 Auto-sklearn 相同的 AutoML 方法,即使用 SMAC [17] 自动配置神经网络;而 Auto-Net 2.0 基于 BOHB [10],贝叶斯优化(BO)和通过 HyperBand(HB)进行的高效锦标赛策略的组合[23]。

在最近的 ChaLearn AutoML Challenge [14] 的人类专家赛道中,Auto-Net 1.0 在两个数据集上取得了最佳性能。据我们所知,这是全自动调整的神经网络第一次在竞赛数据集上赢得了人类专家。Auto-Net 2.0 在大型数据集上对 Auto-Net 1.0 进行了进一步改进,展示了该领域的最新进展。

我们在第 7.2 节和第 7.3 节中分别介绍了 Auto-Net 1.0 和 Auto-Net 2.0 的配置空间及实现。然后,我们在第 7.4 节中对它们的性能进行了研究,并在第 7.5 节中进行了总结。我们省略了对相关工作的详尽讨论,请参阅本书的第 3 章,其中概述了神经网络架构搜索的活跃领域。不过,我们注意到,其他一些最新工具也遵循 Auto-Net 的深度学习自动化的目标,例如 Auto-Keras [20],Photon-AI,H2O.ai,DEvol 或 Google‘s Cloud AutoML 服务。

本章是我们 2016 年发表在 2016 ICML Auto-ML 研讨会上介绍 Auto-Ne t的论文的扩展版本。

Auto-Net 1.0

现在,我们介绍 Auto-Net 1.0 及其实现。我们选择通过添加新的分类(和回归)组件,将 Auto-Ne t的第一个版本实现为 Auto-sklearn [11] 的扩展。这种选择的原因是它使我们能够利用机器学习管道的现有部分:特征预处理,数据预处理和集成构建。在这里,我们将 Auto-Net 限制在完连接的前馈神经网络,因为它们适用于广泛的不同数据集。将其扩展到其他类型的神经网络,例如卷积神经网络或递归神经网络,留待未来工作。为了使用神经网络技术,我们使用了 Python 深度学习库 Lasagne [6],该库围绕 Theano [42] 建立。但是,我们注意到一般而言,我们的方法与神经网络的实现无关。

根据[2]和[7],我们区分了控制架构和训练过程并与层无关的网络超参数,以及为每一层设置的逐层超参数。我们总共优化了 63 个超参数(见表 7.1),对所有类型的监督学习(二分,多类和多标签分类以及回归)使用相同的配置空间。稀疏数据集也共享相同的配置空间。(由于神经网络无法开箱即用地处理稀疏表示形式的数据集,因此,在将数据馈送到神经网络之前,我们会按批次将数据转换为密集表示形式。)

第 k 层的逐层超参数有条件地取决于层数至少为 k 。出于实际原因,我们将层数限制在 1 到 6 之间:首先,我们的目标是使单个配置的训练时间保持较低;其次,每个层在配置空间中增加八个每层超参数,因此允许进一步增加层会使配置过程更加复杂化。

优化神经网络内部权重的最常见方法是使用反向传播计算的偏导数进行随机梯度下降(SGD)。标准 SGD 关键取决于学习率超参数的正确设置。为了减小这种依赖性,已经提出了多种用于随机梯度下降的算法(求解器)。我们在 Auto-Net 的配置空间中包括以下来自文献中的知名方法:基础随机梯度下降(SGD),带动量的随机梯度下降(Momentum),Adam [21],Adadelta [48],Nesterov 动量[28] ]和 Adagrad [8]。另外,我们使用了 vSGD 优化器的一种变体[33],称为 “smorm” ,其中,Hessian 的估计值被平方梯度的估计值替代(如 RMSprop 程序那样计算)。这些方法中的每一种都具有学习率 α\alphaα 和一组自己的超参数,例如 Adam 的动量向量 β1\beta_1β1​ 和 β2\beta_2β2​ 。只有选择了相应的求解器,每个求解器的超参数才处于活动状态。

我们还使用以下策略(在每个纪元 (epoch) t=0…Tt = 0 \dots Tt=0…T 之后将初始学习率乘以一个因子 αdecay\alpha_{decay}αdecay​ )随时间衰减学习率 α\alphaα :

  • 固定的:αdecay=1\alpha_{decay} = 1αdecay​=1
  • Inv: αdecay=(1+γt)(−k)\alpha_{decay} = (1 + \gamma t)^{(-k)}αdecay​=(1+γt)(−k)
  • Exp: αdecay=γt\alpha_{decay} = \gamma^{t}αdecay​=γt
  • Step: αdecay=γ⌊t/s⌋\alpha_{decay} = \gamma^{\lfloor t / s \rfloor}αdecay​=γ⌊t/s⌋

此时,超参数 kkk , sss 和 γ\gammaγ 条件依赖于所选择的策略。

为了在 Auto-Net 1.0 的条件搜索空间中搜索强健的实例,就像在 Auto-WEKA 和 Auto-sklearn 中一样,我们使用了基于随机森林的贝叶斯优化方法 SMAC [17]。 SMAC 是一种随时跟踪当前最佳配置的方法,并在终止时将其输出。

Auto-Net 2.0

AutoNet 2.0 主要在以下三个方面不同于 AutoNet 1.0:

  • 它使用 PyTorch 而不是 Lasagne 作为深度学习库
  • 它使用更大的配置空间,其中包括最新的深度学习技术,现代架构(例如 ResNets ),并包含搜索空间的更紧凑的表示形式
  • 它应用 BOHB 而不是 SMAC 来更高效的获得高性能的神经网络

接下来,我们会详细讨论这三点。

由于 Lasagne 的开发和维护在去年结束,因此我们为 Auto-Net 2.0 选择了另一个 Python 库。目前最受欢迎的深度学习库是 PyTorch [29] 和 Tensorflow [1] 。它们具有非常相似的特性,并且它们提供的详细信息的级别大多不同。例如,PyTorch 为用户提供了在训练过程中跟踪所有计算的可能性。尽管每个库都有各自的优缺点,但由于 PyTorch 具有动态构造计算图的能力,因此我们决定使用 PyTorch 。因此,我们也开始将 Auto-Net 2.0 称为 Auto-PyTorch 。

AutoNet 2.0 的搜索空间包括用于模块选择的超参数(例如,调度程序类型,网络架构)和用于每个特定模块的超参数。它支持如下所述的不同的深度学习模块,例如网络类型,学习速率调度器,优化器和正则化技术。Auto-Net 2.0 的设计也易于扩展;用户可以将自己的模块添加到下面列出的模块中。

Auto-Net 2.0 目前提供了四种不同的网络类型:

  • 多层感知机:这是传统的 MLP 的标准实现,并通过丢弃层进行了扩展[38]。类似于 AutoNet 1.0 中一样,MLP 的每一层都已参数化(例如单元数量和丢弃率)。

  • 残差神经网络 (Residual): 这些是学习残差函数的深度神经网络[47],不同之处在于我们使用完连接层而不是卷积层。按照 ResNets 的标准,该架构由 M 个组组成,每个组按顺序堆叠 N 个残差块。在每个块的架构固定的同时,组的数量 M ,每个组的块数 N ,以及每个组的宽度由超参数确定,如表 7.2 所示。

  • 定型多层感知机 (Shaped): 为了避免每个层具有其自己的超参数(这是搜索的低效率表示),在定型的 MLP 中,层的整体形状是预定义的,例如,作为漏斗 (funnel) ,长漏斗(long funnel) ,菱形 (diamond) ,六角形 (hexagon) ,砖形 (brick) 或三角形 (triangle) 。我们遵循了 https://mikkokotila.github.io/slate/#shapes 中的形状;Ilya Loshchilov 在我们之前就提出通过这种形状进行参数化[25]。

  • 定型残差网络 (Shaped) : 所有层的整体性质都是预定义的

ResNets 和 ShapedResNets 的网络类型也可以使用 Shake-Shake [13] 和 ShakeDrop [46] 的任何正则化方法。MixUp [49] 可以用于所有网络。

当前在 Auto-Net 2.0 中受支持的优化器是 Adam [21] 和带动量的 SGD 。此外,Auto-Net 2.0 当前提供了五种不同的调度程序,这些调度程序会随着时间的推移(取决于纪元数)改变优化器的学习率:

  • 指数 (Exponential) :每个纪元将学习率与一个常数因子相乘

  • 按步 (Step): 通过一个在常数的步骤之后倍增的因子衰减学习率。

  • 循环 (Cyclic): 交替使用加或减,在一个范围内修改学习率。

  • 带热启动的余弦退火: 该学习率调度实现了收敛的多个阶段。在余弦衰减之后,它将学习率降为零[24],并且在每个收敛阶段加热之后,通常会更好地开始下一阶段的收敛。 当提高学习速度时,网络权重不会改变,因此下一阶段的收敛是热启动的。

  • OnPlateau (高原): 每当度量停止改进时,此调度程序都会更改学习率;具体来说,如果在 ppp 个纪元后没有改进,它将当前的学习率乘以一个因子 γ\gammaγ 。

类似于 Auto-Net 1.0 ,Auto-Net 2.0 可以搜索预处理技术。Auto-Net2.0 当前支持 Nyström[45] ,核主成分分析[34],快速独立成分分析[18],random kitchen sinks[ 31]和截断 (truncated) 奇异值分解[15]。用户可以指定要考虑的预处理技术列表,还可以在不同的平衡和归一化策略之间进行选择(对于平衡策略,仅加权损失可用,对于归一化策略,支持最小-最大归一化和标准化)。与 Auto-Net 1.0 相比,Auto-Net 2.0 最终并没有建立集成(尽管此功能可能会很快添加)。 可以在表 7.2 中找到 Auto-Net 2.0 的所有超参数及其各自的范围和默认值。

作为此高度条件空间的优化程序,我们使用了 BOHB(Bayesian Optimization with HyperBand)[10],它结合了传统的贝叶斯优化和基于赌博机的策略 Hyperband [23] ,从而大大提高了效率。像 Hyperband 一样,BOHB 使用重复运行的连续减半[19]将大部分运行时间投入到有前途的神经网络中,并在早期停止训练性能较差的神经网络。像在贝叶斯优化中一样,BOHB 学习哪种神经网络可以产生良好的结果。具体来说,与 BO 方法 TPE [2] 一样,BOHB 使用核密度估计器(KDE)来描述神经网络空间(架构和超参数设置)中的高性能区域,并在使用该 KDE 进行探索与利用之间进行权衡。BOHB 的优点之一是易于并行化,随着工作器数量的增加,几乎实现了线性加速[10]。

作为 BOHB 的预算,我们即可以处理纪元 (epoch) 也可以处理在几分钟内的时间;默认情况下,我们使用运行时间,但用户可以自由调整不同的预算参数。Algorithm 1 中展示了一个示例用法。与 Auto-sklearn 类似,Auto-Net 被构建为 scikit-learn 的估算器插件。用户必须提供训练集和性能指标(例如准确性)。可选地,他们可以指定验证和测试集。在训练期间使用验证集来获取网络性能的度量并训练 BOHB 的 KDE 模型。

实验

现在,我们经验性的评估我们的方法。我们的 Auto-Net 同时实现在 CPU 和 GPU 上的运行,但是由于神经网络大量采用矩阵运算,因此它们在 GPU 上的运行速度要快得多。我们基于 CPU 的实验是在计算集群上运行的,该计算集群的每个节点具有两个八核 Intel Xeon E5-2650 v2 CPU(运行于 2.6 GHz)和 64 GB 的共享内存。我们基于 GPU 的实验是在计算集群上运行的,该集群的每个节点都有四个 GeForce GTX TITANX GPU 。

Auto-Net 1.0 和 Auto-sklearn 的基线评估

在我们的第一个实验中,我们在 AutoML 挑战阶段 0 的五个数据集上比较了 Auto-Net 1.0 的不同实例。首先,我们使用基于 CPU 和基于 GPU 的版本来研究在不同硬件上运行的 NN 的差异;其次,我们允许将神经网络与 Auto-sklearn 的模型相结合;第三,我们还以无神经网络的 Auto-sklearn 作为基线,在每个数据集上,我们对每种方法进行了 10 one-day 的运行,最多允许 100 分钟来通过在训练集上的五折交叉验证评估单个配置。对于每个运行的每个时间步,根据[11],我们从到目前为止已评估的模型中构造出一个整体,并绘制该整体随时间的测试误差。在实践中,我们要么使用单独的程序并行计算集成,要么在优化过程之后进行计算。

图 7.1 显示了五个数据集中的两个数据集的结果。首先,我们注意到基于 GPU 的 Auto-Net 版本始终比基于 CPU 的版本快一个数量级。在给定的固定计算预算范围内,基于 CPU 的版本始终表现较差,而基于 GPU 的版本在 newsgroups 数据集上表现最佳(见图 7.1a),在其他三个数据集上与 Auto-sklearn 表现相当,而在一个数据集上表现较差。尽管基于 CPU 的 Auto-Net 速度非常慢,但在 3/5 案例下,Auto-sklearn 和基于 CPU 的 Auto-Net 的组合仍然比 Auto-sklearn 有所改进。例如,在图 7.1b 中的 dorothea 数据集上可以观察到这一点。

AutoML 竞赛数据集的结果

在第一个 AutoML 挑战赛中开发了 Auto-Net 1.0 之后,我们在最后两个阶段将 Auto-sklearn 和基于 GPU 的 Auto-Net 结合使用,分别赢得了人类专家赛道。 Auto-sklearn 的开发时间比 Auto-Net 更长,更具鲁棒性,因此对于第 3 阶段的 4/5 数据集和第 4 阶段的 3/5 数据集,Auto-sklearn 自身表现最佳,我们只提交了其结果。在这里,我们讨论了使用 Auto-Net 的三个数据集。图 7.2 显示了我们使用 Auto-Net 的三个数据集的官方 AutoML 人类专家赛道的结果。alexis 数据集是挑战的第三阶段(“进阶阶段”)的一部分。为此,我们在五个 GPU 上并行运行了 Auto-Net(使用共享模型模式下的 SMAC)18 小时。我们提交的文件包括一个由 39 个模型组成的自动构建的集成,明显胜过所有人类专家,其 AUC 得分达到90%,而最佳的人类专家(理想的 Intel Analytics)仅达到 80% 。据我们所知,这是第一次由自动构建的神经网络在竞赛数据集上获胜。yolanda 和 tania 数据集是挑战的第四阶段(“专家阶段”)的一部分。对于 yolanda,我们在八个 GPU 上运行了 Auto-Net 48 小时,并自动构建了由五个神经网络组成的集成,获得排名第三。 对于 tania,我们在八个 GPU 上运行 Auto-Net 48 小时,同时在 25 个 CPU 上运行 Auto-sklearn,最后,我们的自动集成脚本构建了八个 1 层神经网络,两个 2 层神经网络和一个通过 SGD 训练的逻辑回归模型的集成。该集成在 tania 数据集上获得了第一名。

对于 tania 数据集,我们还重复了第 7.4.1 节中的实验,图 7.3 显示,对于该数据集,即使仅在 CPU 上运行,Auto-Net 的性能也明显优于 Auto-sklearn 。基于 GPU 的 Auto-Net 性能最佳。

比较 AutoNet 1.0 和 2.0

最后,我们展示了 Auto-Net 1.0 和 2.0 之间的说明性比较。我们注意到 Auto-Net 2.0 具有比 Auto-Net 1.0 更为全面的搜索空间,因此我们希望在足够的时间下它在大型数据集上的性能更好。我们预期搜索更大的空间比搜索 Auto-Net1 的较小空间更困难;但是,由于 Auto-Net 2.0 使用高效的多保真度优化器 BOHB 尽早终止性能不佳的神经网络,因此它可能获得强大的即时性能。另一方面,到目前为止,Auto-Net 2.0 尚未实现集成,并且由于缺少正则化组件及其较大的假设空间,因此与 Auto-Net 1.0 相比,它更容易过拟合。

为了测试这些对不同大小数据集性能的期望,我们使用了一个中等大小的数据集(newgroups,具有 13k 个训练数据点)和一个较小的数据集(dorothea,具有 800 个训练数据点)。结果在表 7.3 展示。

在中等规模的数据集 newsgroups 中,Auto-Net 2.0 的性能比 Auto-Net 1.0 更好,并且使用四个工作器还可以使 Auto-Net 2.0 的速度大大提高,从而使 Auto-Net 2.0 在 Auto-sklearn 和 Auto-Net 1.0 的组合中具有竞争力。我们发现,尽管 Auto-Net 2.0 的搜索空间更大,但它的任何时间性能(使用多重保真度方法 BOHB )都比 Auto-Net 1.0 的性能(使用黑盒优化方法 SMAC)要好。在小型数据集 dorothea 上,Auto-Net 2.0 的性能在早期也比 Auto-Net 1.0更好,但是给予足够时间的情况下,Auto-Net 1.0 的性能会稍好一些。我们将其归因于 Auto-Net 2.0 中缺少集成以及其更大的搜索空间。

结论

我们介绍了 Auto-Net,它提供了自动调整的深度神经网络,而无需任何人工干预。尽管神经网络在许多数据集上表现出优异的性能,但对于具有手动定义特征的传统数据集,它们并不总是表现最佳。但是,我们表明,即使在其他方法的效果更好的情况下,将 Auto-Net 与 Auto-sklearn 结合为一个集成使用也通常会获得比单独使用任何一种方法均等或更好的性能。

最后,我们从 AutoML 挑战赛的人类专家赛道的三个数据集上报告了结果,其中 Auto-Net 分别获得了第三名和两个第一名。我们证明了 Auto-sklearn 和 Auto-Net 的集成可以使用户获得两者的优势并且经常可以在单个工具上进行改进。在新的 Auto-Net 2.0 上进行的首次实验表明,结合使用 BOHB 作为优化程序,使用更全面的搜索空间会产生可喜的结果。

在未来的工作上,我们的目标是将 Auto-Net 扩展到更广泛的神经网络架构,包括卷积和循环神经网络。

AutoML-第七章-AutoNet相关推荐

  1. 数字图像处理——第七章 小波和多分辨处理

    数字图像处理--第七章 小波和多分辨率处理 文章目录 数字图像处理--第七章 小波和多分辨率处理 写在前面 1 多分辨率处理 1.1 图像金字塔 1.2 多尺度和多分辨率的区别 2 小波 2.1 连续 ...

  2. 现实迷途 第七章 特殊客户

    第七章 特殊客户 注:原创作品,请尊重原作者,未经同意,请勿转载,否则追究责任. 江北一般都是上午待在办公室里,搜集信息或整理以前做过的系统,下午才出去站街招客. 站街站了一段时间后,江北有点不想去了 ...

  3. stm32 工业按键检测_「正点原子STM32Mini板资料连载」第七章 按键输入实验

    1)实验平台:正点原子STM32mini开发板 2)摘自<正点原子STM32 不完全手册(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 第七章 按键输入实验 上一章,我们介 ...

  4. 第七章——DMVs和DMFs(2)——用DMV和DMF监控索引性能

    原文: 第七章--DMVs和DMFs(2)--用DMV和DMF监控索引性能 本文继续介绍使用DMO来监控,这次讲述的是监控索引性能.索引是提高查询性能的关键性手段.即使你的表上有合适的索引,你也要时时 ...

  5. 2017上半年软考 第七章 重要知识点

    第七章项目范围管理 []项目范围管理概念 [][]项目范围管理的含义和作用 项目范围管理内容p289 项目范围对项目管理的重要性?p289 [][]项目范围管理的主要过程 项目范围管理的6个过程是? ...

  6. 服务器架构之性能扩展-第七章(8)

    第七章Cacti系统监控邮件报警和压力测试 7.1 Cacti工作原理 原理简单来说,Cacti就是rrdtool的一个forefront,它内置了快速的获数据取工具.优秀的绘图模板以及许多设计精良的 ...

  7. 鸟哥Linux私房菜_基础篇(第二版)_第七章学习笔记

    第七章 Linux文件和目录管理 绝对路径:以"/"开始 相对路径:以非"/"开始 其中,"."代表当前目录,".."代 ...

  8. 计算机组成原理 输入输出系统,计算机组成原理(第七章输入输出系统

    计算机组成原理(第七章输入输出系统 (6页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.9 积分 第七章输入输出系统第一节基本的输入输出方式一. 外围 ...

  9. 课本学习笔记5:第七章 20135115臧文君

    第七章 链接 注:作者:臧文君,原创作品转载请注明出处. 一.概述 1.链接(linking):是将各种代码和数据部分收集起来并组合成为一个单一文件的过程,这个文件可被加载或被拷贝到存储器并执行. 2 ...

最新文章

  1. 《树莓派Python编程指南》—— 1.3 树莓派快速指南
  2. 马斯克新视频:Boring公司将优先解决公交快速通勤
  3. smbus使用 树莓派_树莓派学习笔记——I2C使用 PCF8574 Python SMBUS
  4. 3天超4亿 《阿丽塔:战斗天使》中国票房超北美
  5. Fastjson 1.2.22-24 反序列化漏洞分析
  6. Mac废纸篓无法清空怎么办?
  7. 《人月神话》出版后的网友评论
  8. centos 的 tar 命令
  9. 解决tooltips鬼畜问题
  10. 【写给初发论文的人】撰写综述性科技论文常见问题
  11. 人生,有时需要不知足!
  12. 学生信息管理系统-数据结构课程设计
  13. win10停止更新_你的win10即将终止!各大版本服务终止日期大全,准备好了吗?...
  14. MATLAB绘图(一)
  15. 电脑系统怎么重装win11
  16. jQuery过滤、遍历同级元素、向上遍历、向下遍历
  17. strtok 详解及实现
  18. C#开发Active控件
  19. 关于下载JDK需要注册账号
  20. 【学习笔记】C++ 核心编程(二)类和对象——封装

热门文章

  1. makefile文件解释
  2. Pytorch基础打卡01
  3. 音乐及游戏爱好者的福利,小鹏P7上新网易云及阴阳师,赶快看看吧
  4. insert 插入数据
  5. 插入排序:直接插入、交换插入、折半插入
  6. 利用7z程序压缩、解压
  7. error: cannot connect to daemon
  8. 什么是库存?什么是零库存?库存的定义
  9. 利用RunLoop空闲时间执行预缓存任务
  10. Python面向对象编程(类编程)中self的含义详解(简单明了直击本质的解释)