Abstract

作者训练了一个大型的深度卷积神经网络,用于在 ImageNet LSVRC-2010 比赛中对120万张高分辨率图像分为1000个不同的类别。在测试数据上,作者们达到了 top-1 和 top-5 的 error rates,分别为37.5% 和 17.0%,相比起过去最先进技术要好得多。

该神经网络有6000万个参数和65万个神经元,由5个卷积层组成,其中一些卷积层添加了最大池化层,然后是3个全连接层,最后是1000路 softmax。为了使训练更快,作者使用了非饱和神经元和高效的 GPU 进行卷积运算。为了减少全连接层中的过拟合,作者采用了一种最近开发的正则化方法 “dropout”,该方法非常有效。

作者还在 ILSVRC-2012 比赛中应用了 AlexNet 的一个变体,并获得了 15.3% 的 winning top-5 的 test error rates,而第二名的 test error rates 为 26.2%。

1 Introduction

目前的目标识别方法主要利用机器学习方法。为了提高它们的性能,我们可以收集更大的数据集,学习更强大的模型,并使用更好的技术来防止过拟合。但截止目前,标记图像的数据集相对较少(数万张)。这种数量级的数据集可以应付简单的识别任务,也可以对数据集使用标签保留转换进行扩大。例如,MNIST数字识别任务的当前最佳错误率(<0.3%)接近人类。但现实环境中的物体会表现出相当大的可变性,因此要学会识别它们,就必须使用更大的训练集。事实上,小图像数据集的缺点已经人尽皆知,但直到最近才有可能收集具有数百万张图像的标记数据集。新的更大的数据集包括LabelMe(数十万个完全分割的图像)ImageNet(超过22000个类别、超过1500万张标记高分辨率图像)。

为了从数百万张图像中学习数千个分类,我们需要一个具有强大学习能力的模型。然而,即使是像 ImageNet 这样大的数据集也不能解决物体识别任务的巨大复杂性的问题,因此我们的模型还应该有大量的先验知识来弥补我们没有的所有数据。

卷积神经网络则满足上述条件。它们的容量可以通过改变它们的深度和广度来控制,而且它们还对图像的性质做出了强有力的和大多数正确的假设(即统计的平稳性和像素依赖的局部性)。因此,与具有相似 layer-size 的标准前馈神经网络相比,CNN 具有更少的连接和参数,因此更容易训练,而理论上最好的性能可能也只是稍差一点。

尽管 CNN 具备优秀的特质、其架构也相对高效,但要大规模应用于高分辨率图像,它们的训练开销仍然高得令人望而却步。幸运的是,目前的 GPU 配合高度优化的2D卷积,已经足以训练大型 CNN,而且最近的数据集(ImageNet)也包含足够多的 label 示例,可以在没有严重过拟合的情况下训练此类模型。

本文的具体贡献如下:

  1. 在 ILSVRC-2010 和 ILSVRC-2012 比赛中使用的 ImageNet 子集上训练了迄今为止最大的卷积神经网络之一,并在这些数据集上获得了迄今为止报道过的最好的结果。
  2. 编写了一个高度优化的 GPU 实现,可用于2D卷积和训练卷积神经网络中固有的所有其他操作,并将其公开提供。我们的网络包含了许多新的、不寻常的特征,这些特征提高了它的性能,减少了它的训练时间,这些在第3节中有详细介绍。
  3. 即使有120万个标记的训练示例,网络的规模也使得过拟合成为一个关键的问题,因此作者使用了几种有效的技术来防止过拟合,这些技术在第4节中描述。
  4. 最终的网络包含5个卷积层和3个全连接层,网络深度似乎很重要:作者发现,删除任何一个卷积层(每个卷积层包含的模型参数不超过1%)都会导致性能变差。

最后,网络的大小主要受限于当前 GPU 显存,以及可接受的训练时间。AlexNet 需要通过两个GTX 580 3GB gpu 训练5-6天。所有的实验都表明,只要等待更快的 GPU 和更大规模的数据集出现,AlexNet 的性能会得到明显改善。

2 The Dataset

ImageNet 是一个包含超过1500万张标记高分辨率图像、大约22000个类别的数据集。图片是从网上收集的,并由人工标记。从2010年开始,一年一度的 ImageNet 大规模视觉识别挑战赛 ILSVRC 举行。ILSVRC 使用ImageNet 的一个子集,1000个类别中每个类别大约有1000张图像。总共大约有120万张训练图像、5万张验证图像和15万张测试图像。

ILSVRC-2010 是 ILSVRC 中唯一一个测试集 labels 可用的版本,所以作者在这个版本进行了大部分实验。作者也参加了 ILSVRC-2012 竞赛,因此在第6节中也报告了在这个版本的数据集上的结果,因为2012年开始ILSVRC不公开测试集,因此并不能得知测试集错误率。

ImageNet 由多种分辨率的图像组成,而我们的系统需要恒定的输入维数。因此,我们将图像采样到256 × 256的固定分辨率。给定一个矩形图像,我们首先重新缩放图像,使较短的边的长度为256,然后从结果图像中裁剪出中央的 256×256 patch。除了从每个像素中减去训练集上的 mean activity(中心化处理),我们没有以任何其他方式对图像进行预处理。所以我们将在像素的原始RGB值(中心化处理过的rgb值)上训练我们的网络。

3 The Architecture

AlexNet 架构如图2所示。它包含八个学习层——五个卷积层和三个全连接层。下面将描述 AlexNet 架构的一些新颖或不寻常的特征。章节 3.1-3.4 会根据其重要性的估计进行排序,最重要的放在前面。

3.1 ReLU Nonlinearity

将神经元的输出 \(f\) 建模为输入 \(x\) 的函数的标准方法是 \(f(x)=tanh(x)\) 和 \(f(x) = (1 + e^{-x})^{-1}\)。在梯度下降的训练时间方面,这些饱和非线性函数比非饱和非线性函数慢得多 \(f(x)=max(0, x)\) —— Relu。使用 ReLUs 的深度卷积神经网络的训练速度比使用 tanh 单位等效速度快几倍。图1演示了这一点,该图显示了对于特定的四层卷积网络,在 CIFAR-10 数据集上达到 25% 训练误差所需的迭代次数。这张图表明,如果我们使用传统的饱和神经元模型(tanh),需要的训练次数将会成倍增长,从而导致难以训练如此大的神经网络进行实验。

作者也并不是第一个考虑在 CNN 中替代传统神经元模型的人。例如,Jarrett 等人在论文中声称:通过采用 \(f(x)=|tanh(x)|\) 在 Caltech-101 数据集上也能够起到不错的效果。

但针对 Caltech-101 这个较小规模的数据集,Jarrett 等人主要关注的是防止过拟合,因此他们观察到的效果与我们使用 ReLUs 时关注的加速拟合作用不同。快速学习对在大数据集上训练的大模型的性能有很大的影响。

3.2 Training on Multiple GPUs

单个 GTX 580 GPU 只有 3GB 内存,这限制了可以在其上训练的网络的最大大小。事实证明,120万个训练示例足以训练一个 GPU 显存无法容纳的网络,因此考虑将网络分布在两个 GPU 上进行训练。目前的 GPU 特别适合跨 GPU 并行化,因为它们能够直接读取和写入彼此的内存,而不需要经过主机内存。

显存不仅要保存模型的参数,还要保存梯度下降的中间结果,梯度下降的batch-size越大需要的显存就越大。

显然,3GB是无法满足作者训练8层的深度卷积神经网络的,并行化主要也是为了解决显存问题,其次才是训练速率问题。

作者采用的并行化方案本质上是把一半的内核(或神经元)放在每个GPU上,GPU 只在特定的层进行通信。例如,第3层的神经元可以从第2层的两个 GPU 输出通信;但第4层的神经元只从位于同一 GPU 上的第3层获取输入。这种连接模式是基于交叉验证实现的,并且可以通过超参精确地调整通信量,直到当前连接的计算量达到一个可接受范围。

最终的架构有点类似于 Cire san 等人所使用的柱状CNN,但 AlexNet 有多个列 (见图2)。双 GPU 的方案将我们的 top-1、top-5 的错误率分别降低了 1.7% 和 1.2% 。且双 GPU 的训练时间比单 GPU(半参数)略短。

单 GPU 半参数并不能减少最后一个卷积层和全连接层的参数,作者应该是在前几层减少了每层卷积核的个数。

3.3 Local Response Normalization

Relu有一个理想的特性,即它们不需要对输入归一化来防止它们饱和。如果至少有一些训练示例对 ReLU 产生正输入,学习就会发生在该 Relu 对应的神经元上。

然而,作者发现的局部归一化 LRN 仍有助于防止过拟合。用 \(a^{i}_{x,y}\) 表示第 i 个通道的 featuremap 上坐标为 (x, y) 的值,N 表示 featuremap 的通道数,\((k, α, β, n)\) 都是可调整超参,然后将 Relu 的输出作为局部归一化的值 \(a^{i}_{x, y}\) ,局部响应归一化由表达式给出:

\(b_{x, y}^{i}=a_{x, y}^{i} /\left(k+\alpha \sum_{j=\max (0, i-n / 2)}^{\min (N-1, i+n / 2)}\left(a_{x, y}^{j}\right)^{2}\right)^{\beta}\)

其中求和操作是在同一空间位置的 n 个相邻的 featuremap 上执行,N 是该层中 featuremap 的总数,k 保证了分母不为0。当然,featuremap 的顺序是任意的,在训练开始之前就确定了。LRU 是受到了真实神经元的 “横向抑制” 的启发。在 AlexNet 中,采用交叉验证的方式寻找到了超参 \(k = 2, n = 5, α = 10−4, β = 0.75\)。我们在某些层应用了 ReLU 非线性之后应用了这个归一化(参见第3.5节)。

横向抑制:更加活跃的神经元其附近的神经元会受到抑制。

该方案与 Jarrett等人提出的局部对比度归一化方案有一些相似之处,但LRN 更准确地可以被称为“亮度归一化”,因为它没有减去平均值。LRN 将 top-1 和 top-5 的错误率分别降低了 1.4% 和 1.2%。作者还在 CIFAR-10 数据集上验证了该方案的有效性:四层 CNN 在进行 LRN 处理的情况下实现了 13% 的测试错误率,在 LRN 处理后实现了 11% 的测试错误率。

LRN 在 VGG 的论文中被推翻了。

3.4 Overlapping Pooling

CNN 中的池化层结合了同一 featuremap 中相邻神经元组的输出。传统上池化窗口之间是不重叠的。更准确地说,设池化步长为s,池化窗口长度为z,s = z 时,我们采用的是标准最大池化;s < z时,则是重叠最大池化。AlexNet使用s = 2、z = 3。

与非重叠方案相比,重叠池化方案将 top-1 和 top-5 的错误率分别降低了 0.4% 和 0.3%,作者还在训练过程中观察到,重叠池化可以避免过拟合。

重叠最大池化在 VGG 的论文中被推翻了。

3.5 Overall Architecture

这部分描述 CNN 的整体架构。如图2所示,网络包含8个权重层;前五个是卷积层,剩下三个是全连接层。最后一个全连接层的输出被馈送到一个1000路 softmax,它产生1000个类标签的分布。AlexNet 最大化了多分类逻辑回归目标(可能性最大的分类对应 softmax 的最大输出),这相当于最大化了对数似然概率。

最大化对数似然概率

也就是让所有样本的后验概率相乘结果最大化,为了避免结果趋近于0采用对数的方式进行对数似然处理。

第二层、第四层和第五层卷积层的 featuremap 只连接到前一层位于同一 GPU 上的 featuremap(见图2)。第三层卷积层的 featuremap 连接到第二层的所有 featuremap。全连接层中的神经元与前一层中的所有神经元连接。LRN 层紧随第一和第二卷积层。最大重叠池化层在 LRN 层和第五卷积层之后。ReLU 应用于每个卷积和全连接层的输出。

第一个卷积层对 227×227×3 输入图像进行过滤,使用 96 个大小为 11×11×3 的卷积核,卷积步幅为4(这是 featuremap 中相邻神经元的感受野中心之间的距离)。第二卷积层将第一卷积层的输出(响应归一化和池化)作为输入,并使用256个大小为 5×5×48 的卷积核进行过滤。第三、第四和第五卷积层彼此连接,没有任何中间的池化层或归一化层。第三卷积层有384个大小为 3×3×256 的卷积,连接到第二卷积层的输出(归一化,池化)。第四卷积层有384个 3×3×192 大小的卷积核,第五卷积层有256个 3×3×192 大小的卷积核。全连接层每层有4096个神经元。

4 Reducing Overfitting

AlexNet 网络架构有六千万个参数。尽管 ILSVRC 的1000个类别只需要10个bit位就能够存储(\(2^{10}=1024\)),但要把图像映射成1000个类别标签需要存储的参数就远远不止了,要学习这么多参数是非常容易过拟合的。下面将描述对抗过拟合的两种主要方法。

4.1 Data Augmentation

减少图像数据过拟合的最简单、最常见的方法是使用 “标签保留转换” 人为地扩大数据集。作者采用了两种不同的数据增强形式,这两种形式都允许通过很少的计算量从原始图像生成转换后的图像,因此转换后的图像不需要存储在磁盘上。转换图像的操作是在 CPU 上用 Python 代码生成的,也就是说,转换图片跟训练这两个操作是并发运行的,当转换图像生成成功时, GPU 正在对前一批转换图像进行训练,也就不会导致额外的时间开销。

第一种形式的数据增强包括:图像平移和水平反射。为此,我们从 256×256 图像中提取随机的 224×224 patch(及其水平反射),并在这些提取的 patchs 上训练我们的网络。

这也是为什么图2中的输入是 224×224(作者标注错了,输入应该是227×227 而不是 224×224,这里姑且当做 224×224)

这使得训练集的大小增加了2048倍,尽管处理后所得到的训练示例相互之间是高度相互依赖的。但如果没有这个方案,我们的网络将遭受严重的过拟合,这将迫使我们使用更小的网络。

在测试时,会通过将测试集的 224×224 的图片进行裁剪,提取其中的5个 224×224 的 patch(四个对角 patch 和中心 patch)及其水平反射(共10个 patch,因为还有水平反射)进行预测,并将网络的 softmax 层对这10个 patch 的预测结果取平均。

这个倍率也是基于224×224计算的,256-227=32,32×32=1024,平移反射1024×2=2048

数据增强的第二种形式包括改变训练图像中 RGB 通道的强度。具体来说是对整个 ImageNet 训练集中,对图像的 RGB 像素值执行PCA。对每个训练图像,我们找到的主成分的倍数,其大小与对应的特征值 \(λ_i\) 乘以一个随机变量 \(α_i\) 成正比,\(α_i\) 从一个均值为零,标准差为0.1的高斯分布中提取。因此对每个 RGB 图像像素 \(I_{xy}=[I^{R}_{xy}, I^{G}_{xy}, I^{B}_{xy}]^T\),我们添加如下公式:

\(I_{xy}=[I^{R}_{xy}, I^{G}_{xy}, I^{B}_{xy}]^T = [p_1, p_2, p_3][α_1λ_1, α_2λ_2, α_3λ_3]^T\)

其中 \(p_i\) 和 分别为 RGB 像素值的 3×3 协方差矩阵的第 i 个特征向量,\(λ_i\) 为协方差矩阵的特征值,\(α_i\) 为随机变量。对于特定训练图像的所有像素,每个 αi 只使用一次,直到该图像再次用于训练,此时它将被重新绘制。该方案大致捕捉了自然图像的一个重要性质,即对象识别并不会受到光照强度以及颜色的影响。该方案将 top-1 错误率降低了 1% 以上。

4.2 Dropout

集成多个不同模型可有效防止过拟合,但对于已经需要几天训练的大型神经网络来说这个方案不太经济。然而,有一个非常有效的方案,在训练期间只需花费大约两倍的训练成本就能够达到集成模型的效果。

最近引入的技术 dropout 将会以0.5的概率把每个神经元的输出设置为零。以这种方式被 “丢弃” 的神经元不参与正向传递,也不参与反向传播。所以每次输入训练样本时,神经网络都会对不同的 “残余网络” 进行采样,但所有的 “残余网络” 都共享权重。

这种技术减少了神经元复杂的协同适应,因为一个神经元不能依赖于特定的其他神经元的存在。因此,通过dropout处理,神经元与另一个随机的神经元相互协作,从而让每一个神经元都被迫学习更健壮的特征。在测试时,我们使用所有的神经元,将它们的输出乘以0.5,对于指数级多的dropout网络产生的预测分布的几何平均值,0.5是一个合理的近似值。

“近亲结婚容易生出傻孩子”

我们在图2的前两个全连接层中使用dropout。在没有 dropout 的情况下,我们的网络表现出严重的过拟合。Dropout大约使收敛所需的迭代次数翻了一番。

5 Details of learning

我们使用随机梯度下降训练我们的模型,批大小为128个样本,动量为0.9,权重衰减为0.0005。作者发现这种少量的权重衰减对模型的学习很重要。权值衰减不仅仅起到了正则化的作用,还减少了模型的训练误差。权重 \(w\) 的更新规则为

\(
v_{i+1}:=0.9 \cdot v_{i}-0.0005 \cdot \epsilon \cdot w_{i}-\epsilon \cdot\left\langle\left.\frac{\partial L}{\partial w}\right|_{w_{i}}\right\rangle_{D_{i}}
\)

\(
w_{i+1} := w_i + v_{i+1}
\)

其中 \(i\) 为迭代指标,\(v\) 为动量变量,\(\epsilon\) 为学习率,\(\left\langle\left.\frac{\partial L}{\partial w}\right|_{w_{i}}\right\rangle_{D_{i}}\) 是第 \(i\) 批目标对 \(w\) 求导的平均值,在 \(w_i\) 处求值。

每一层权重的初始化按照均值为0,标准差为0.01的高斯分布进行分配初始化。用常数1初始化了第二层、第四层和第五层卷积层以及全连接隐藏层中的神经元偏差值。偏差值的这种初始化方式向relu提供了更加积极的输入来加速早期的学习阶段(避免过早出现0的Relu输出)。我们用常数0初始化剩余层中的神经元偏差。

我们对所有层使用相同的学习率,并且在整个训练过程中手动调整。调整学习率遵循的启发式方法是:当验证错误率不再随着当前学习率的提高而提高时,将学习率手动除以10。

学习率初始为0.01,训练结束前降低3次学习率。作者通过120万张图像的训练集对网络进行了大约90个周期的训练,在两个 NVIDIA GTX 580 3GB gpu 上花费5到6天的时间。

Results

作者在 ILSVRC-2010 上的结果汇总在表1中。AlexNet 达到了 top-1 和 top-5 的 test error rates 分别为 37.5% 和 17.0%。

在 ILSVRC-2010 竞赛中,使用六种稀疏编码模型(Sparse coding)对不同特征进行平均预测获得的最佳性能分别为 47.1% 和 28.2%,使用两种分类器对 Fisher Vectors(FVs) 进行平均预测(SIFT+FVs)获得的最佳性能分别为 45.7% 和 25.7%(两种分类器对两种密集采样特征进行平均预测)。

作者也参加了 ILSVRC-2012 竞赛,结果汇总在表2。由于 ILSVRC-2012 测试集 labels 不公开,因此不能报告测试错误率。在本段的其余部分将交替使用验证和测试错误率,因为根据经验来看,它们的差异不超过0.1%(见表2)。

本文中描述的 CNN 达到了 18.2% 的 top-5 error rates。将五个相似 CNN 的预测结果平均起来,错误率为 16.4%。训练一个 CNN (该 CNN 在最后一个池化层上增加一个额外的第六卷积层,)对整个ImageNet.2011(1500万张图像,22K个类别)进行分类,然后在 ILSVRC-2012 上对模型进行微调,错误率为 16.6%。将两个 CNN 与前面提到的五个 CNN 进行平均,错误率为 15.3%。第二名的竞赛参赛作品仅达到了 26.2% 的错误率,其方法SIFT+FVs。

最后,作者还报告了对 2009-ImageNet 数据集进行分类的错误率,其中包含 10184 个类别和 890 万张图像。在这个数据集上,我们遵循文献中的约定,使用一半的图像进行训练,一半用于测试。由于没有已建立的测试集,数据集分割必然与以往作者使用的分割不同,但这并不会显著影响结果。在这个数据集上的 top-1、top-5 error rates 分别为 67.4% 和 40.9%,这是通过上面描述的网络实现的,但作者在最后一个池化层上新增加了第6个卷积层。而截止目前,该数据集发表的最佳结果分别为 78.1% 和 60.9%。

《ImageNet Classification with Deep Convolutional Neural Networks (AlexNet)2012》的更多相关文章

  1. ImageNet Classification with Deep Convolutional Neural Networks(译文)转载

    ImageNet Classification with Deep Convolutional Neural Networks Alex Krizhevsky, Ilya Sutskever, Geo ...

  2. 《ImageNet Classification with Deep Convolutional Neural Networks》 剖析

    <ImageNet Classification with Deep Convolutional Neural Networks> 剖析 CNN 领域的经典之作, 作者训练了一个面向数量为 ...

  3. IMAGENT CLASSIFICATION WITH DEEP CONVOLUTIONAL NEURAL NETWORKS(翻译)

    0 - 摘要  我们训练了一个大型的.深度卷积神经网络用来将ImageNet LSVRC-2010竞赛中的120万高分辨率的图像分为1000个不同的类别.在测试集上,我们在top-1和top-5上的错 ...

  4. 论文解读《ImageNet Classification with Deep Convolutional Neural Networks》

    这篇论文提出了AlexNet,奠定了深度学习在CV领域中的地位. 1. ReLu激活函数 2. Dropout 3. 数据增强 网络的架构如图所示 包含八个学习层:五个卷积神经网络和三个全连接网络,并 ...

  5. ImageNet Classification with Deep Convolutional Neural Network(转)

    这篇论文主要讲了CNN的很多技巧,参考这位博主的笔记:http://blog.csdn.net/whiteinblue/article/details/43202399 https://blog.ac ...

  6. AlexNet论文翻译-ImageNet Classification with Deep Convolutional Neural Networks

    ImageNet Classification with Deep Convolutional Neural Networks 深度卷积神经网络的ImageNet分类 Alex Krizhevsky ...

  7. 中文版 ImageNet Classification with Deep Convolutional Neural Networks

    ImageNet Classification with Deep Convolutional Neural Networks 摘要 我们训练了一个大型深度卷积神经网络来将ImageNet LSVRC ...

  8. 1 - ImageNet Classification with Deep Convolutional Neural Network (阅读翻译)

    ImageNet Classification with Deep Convolutional Neural Network 利用深度卷积神经网络进行ImageNet分类 Abstract We tr ...

  9. [论文阅读] ImageNet Classification with Deep Convolutional Neural Networks(传说中的AlexNet)

    这篇文章使用的AlexNet网络,在2012年的ImageNet(ILSVRC-2012)竞赛中获得第一名,top-5的测试误差为15.3%,相比于第二名26.2%的误差降低了不少. 本文的创新点: ...

  10. 论文阅读笔记二-ImageNet Classification with Deep Convolutional Neural Networks

    分类的数据大小:1.2million 张,包括1000个类别. 网络结构:60million个参数,650,000个神经元.网络由5层卷积层,其中由最大值池化层和三个1000输出的(与图片的类别数相同 ...

随机推荐

  1. Canvas:绘制失败的问题

    beginPath 绘制路径必须添加 beginPath().它标志着一个画笔在画布中哪个地方开始画起.没有它,新起的画笔位置必定与上一次画笔结束的位置相连. // 第一个半圆 ctx.arc(60, ...

  2. 腾讯云对象存储 COS搭建个人网站

    腾讯云对象存储 COS搭建个人网站,简单易操作,方便快捷.   只需要将你的网站资源上传即可,然后设置上你的自定义 CDN 加速域名,一个个人网站就上线啦!当然,你也可以不用设置自定义 CDN 加速域 ...

  3. Java Agent场景性能测试分析优化经验分享

    摘要:本文将以Sermant的SpringBoot 注册插件的性能测试及优化过程为例,分享在Java Agent场景如何进行更好的性能测试优化及在Java Agent下需要着重注意的性能陷阱. 作者: ...

  4. docker 自动部署相关

    docker的作用:Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.通俗点讲就是搭建一个运 ...

  5. 浏览器调试工具devtool

    视频网址 先打开devtool,再打开命令菜单.可以用screenshot来截屏 $0:先在element点击元素,再在控制台输入$0,这个$0代表element中选中的DOM元素. $1,$2... ...

  6. angular - 另一个ID为#######的进程当前正在运行ngcc

    angular项目启动时报错 首先尝试npm install再次运行,看看它是否可以解决您的问题. 尝试ngcc手动运行. 删除这个文件 node_modules/@angular/compiler- ...

  7. [网鼎杯2020]boom

    [网鼎杯2020]boom 分析 感觉比较友善,主要考查数学运算. 解析 解压之后发现是个exe文件,运行得到一个md5 查询: 输入明文得到: 下个挑战是解三元一次方程: 拿matlab算一下. s ...

  8. VUE学习-自定义修饰符

    自定义修饰符 组件 const myComponent = { template: `<input type="text" :value="modelValue&q ...

  9. pytest框架增加log打印(包括pytest的执行结果、自定义的log信息)

    前言: 之前同事在跑脚本的时候报错了,发现没法把需要的log信息打印出来,我这边定位问题比较麻烦,所以增加了log的打印.这个问题之前已经处理过了,本来以为是小问题,结果今天又要用到这个小技巧的时候居 ...

  10. <input>输入框,限制输入的为正整数

    <input id="eventId" col="EventId" type="text" class="form-cont ...