Adversarial Logit Pairing

Adversarial Logit Pairing

we introduce enhanced defenses using a technique we call logit pairing, a method that encourages logits for pairs of examples to be similar.

本文提出了一种logit pairing方法做防御。

0. Recall

0.1 Adversarial Training

Algotirhm
图片来源见水印。

Formulation

0.2 FGSM and AT

在[Explaining and harnessing adversarial examples论文中,作者

  • 提出了FGSM
  • 提出了对抗训练。

J~(θ,x,y)=αJ(θ,x,y)+(1−α)J(θ,x+ϵsign⁡(∇xJ(θ,x,y))\tilde{J}(\theta, x, y)=\alpha J(\theta, x, y)+(1-\alpha) J\left(\theta, x+\epsilon \operatorname{sign}\left(\nabla_{x} J(\theta, x, y)\right)\right. J~(θ,x,y)=αJ(θ,x,y)+(1−α)J(θ,x+ϵsign(∇x​J(θ,x,y))

1. Introduction

Contributions:

  • 在大规模数据集(ImageNet)上开展了对抗训练;
  • 提出了Logit Pairing. 一种鼓励两对样本logit相似的方法。本文提出了两种logit pairingclean and adversarial.(ALP和CLP)
  • 实验表明,使用本文提出的CLP方法就能像对抗训练一样提高模型的鲁棒性,并在一定程度上防御住黑盒PGD攻击;
  • 实验表明,基于ALP训练的模型不管是白盒还是黑盒攻击下,都能获得很好的鲁棒性;
  • 还发现,基于ALP训练模型得到的攻击样本攻击性很强,对于之前最强的防御方法都不能防御住攻击(ensemble adverarial training)。

2. Definitions and threat models

**约束:**威胁模型明确了攻击者(方)的能力,本文将攻击方法界定在可以进行L∞L_{\infty}L∞​操作方法上。这是一种简化操作,但是更适合用于和benchmark工作进行对比。

针对两种威胁模型(threat model):

  • White box:攻击者掌握了模型的所有信息(架构、参数等);
  • **Black box:**攻击者无法获得模型的架构和参数,只能有限次查询。

3. The Challenges of defending ImageNet classifiers

首先,之前已经提出了很多的防御方法,但是目前除了基于Madry(PGD)的对抗训练方法还未被攻破外,其它方法基本都已经不能有效的起到防御作用。因此,本文基于Madry的方法开展研究,并首次将该方法应用于大数据集(ImageNet)。

同时,本文还提及了Adversarial machine learning at scale,包括一些结论:

  • 使用单步攻击攻击方法对抗训练得到的模型,在单步攻击方法下还能得到一定的鲁棒性(不能防御住多步攻击方法的攻击);
  • 多步迭代攻击方法(Iter.l.l. & Iter. basic)对抗训练并未实现。

本文的工作不同的两点包括:

  • 直接基于Madry对抗训练方法在ImageNet数据集上提高了模型的鲁棒性(第一次);
  • 另外,以Madry的方法为baseline,本文提出了新的强化的防御方法,大大提高了模型在ImageNet数据集上的鲁棒性。

注意:在使用PGD生成对抗样本时,采用随机初始化操作。

4. Methods

4.1 Adversarial Training

PGD是一个通用的一阶攻击方法,也即如果某种方法对PGD攻击鲁棒,则对所有的一阶攻击方法都应该鲁棒。

本文的对抗训练使用PGD作为基本攻击方法(use AT with PGD as the underlying basis for our methods.):

arg⁡min⁡θE(x,y)∈p^data (max⁡δ∈SL(θ,x+δ,y))\underset{\theta}{\arg \min } \mathbb{E}_{(x, y) \in \hat{p}_{\text {data }}}\left(\max _{\delta \in S} L(\theta, x+\delta, y)\right) θargmin​E(x,y)∈p^​data ​​(δ∈Smax​L(θ,x+δ,y))
其中,

  • p^data\hat p_{data}p^​data​是潜在的训练数据分布;
  • L(θ,x,y)L(\theta,x,y)L(θ,x,y)是loss function.

本文并没有直接使用Madry提出的对抗训练流程,而是进行了处理,将干净样本和对抗样本混合训练:
arg⁡min⁡θ[E(x,y)∈p^data (max⁡δ∈SL(θ,x+δ,y))+E(x,y)∈p^data (L(θ,x,y))]\begin{array}{c} \arg \min _{\theta}\left[\mathbb{E}_{(x, y) \in \hat{p}_{\text {data }}}\left(\max _{\delta \in S} L(\theta, x+\delta, y)\right)+\right. \\ \left.\mathbb{E}_{(x, y) \in \hat{p}_{\text {data }}}(L(\theta, x, y))\right] \end{array} argminθ​[E(x,y)∈p^​data ​​(maxδ∈S​L(θ,x+δ,y))+E(x,y)∈p^​data ​​(L(θ,x,y))]​
即前面部分是对抗样本,后面部分是干净样本。本文称之为mixed-minibatch PGD(M-PGD)

虽然对其对抗训练过程进行了改动,但是最终攻击时仍然使用的是PGD方法。

4.2 Logit pairing

提出了logit pairing,一种使得两张图片在logits上相似的方法。

计算输入xxx的logits输出向量:z=f(x)z=f(x)z=f(x)。定义logit pairingloss
λL(f(x),f(x′))\lambda L(f(x),f(x')) λL(f(x),f(x′))
是训练数据xxx和x′x'x′的loss

其中:

  • λ\lambdaλ:惩罚因子。决定logit pairingloss的强度;
  • LLL:用于使得logit pairing相似的loss function,本文使用的是L2L^2L2。

本文对对抗样本和干净样本分别提出了logit pairing

这里的f(x)f(x)f(x)是个啥?

  • 模型关于xxx的logit layer输出?
  • 还是<EYD与机器学习>:对抗攻击基础知识(九)给出的:

f(x)=x1−xf(x)=\frac{x}{1-x} f(x)=1−xx​

4.2.1 Adversarial logit pairing

**Adversarial logit pairing(ALP)**匹配的是干净样本xxx和它对应的对抗样本x′x'x′间的logits

Motivation:在一般地的对抗训练中,模型被训练成要将干净样本xxx和对应的对抗样本x′x'x′都分类成同样的类别,但是训练过程中,模型并没有接收到额外的信息,表明对抗样本x′x'x′和干净样本xxx更相似。

ALP提供了一个额外的正则项,鼓励在同一样本的干净样本和对抗样本中内嵌更多的相似信息,来帮助模型更好的对数据内进行表达。

考虑以下场景:

  • θ\thetaθ:表示模型的参数;
  • M\mathbb MM:minibatch数据,{x(1),...,x(m)}\{x^{(1)},...,x^{(m)}\}{x(1),...,x(m)}和{x~(1),...,x~(m)}\{\tilde x^{(1)},...,\tilde x^ {(m)}\}{x~(1),...,x~(m)}分别表示minibatch下的干净样本和对抗样本;
  • f(x;θ)f(x;\theta)f(x;θ):是输入的logit输出,即softmax前一层;
  • J(M,θ)J(\mathbb M, \theta)J(M,θ):对抗训练的loss function(例如用于训练模型的CE)。

Adversrial logit pairing优化以下loss:
J(M,θ)+λ1m∑i=1mL(f(x(i);θ),f(x~(i);θ))J(\mathbb{M}, \theta)+\lambda \frac{1}{m} \sum_{i=1}^{m} L\left(f\left(x^{(i)} ; \theta\right), f\left(\tilde{x}^{(i)} ; \theta\right)\right) J(M,θ)+λm1​i=1∑m​L(f(x(i);θ),f(x~(i);θ))

4.2.2 clean logit pairing

同样是两个样本xxx和x′x'x′,但此时x′x'x′不表示对抗样本,也表示干净样本。xxx和x′x'x′表示两个随机选择的干净训练样本,因此也不一定是同一个类别的样本。

J(clean)(M,θ)J^{(clean)}(\mathbb M, \theta)J(clean)(M,θ)表示用于干净样本上训练loss function,一般也是CEClean logit pairing优化目标是:
J(clean )(M,θ)+λ2m∑i=1m2L(f(x(i);θ),f(x(i+m2);θ))J^{(\text {clean })}(\mathbb{M}, \boldsymbol{\theta})+\lambda \frac{2}{m} \sum_{i=1}^{\frac{m}{2}} L\left(f\left(\boldsymbol{x}^{(i)} ; \boldsymbol{\theta}\right), f\left(\boldsymbol{x}^{\left(i+\frac{m}{2}\right)} ; \boldsymbol{\theta}\right)\right) J(clean )(M,θ)+λm2​i=1∑2m​​L(f(x(i);θ),f(x(i+2m​);θ))
提出CLP的一个重要原因要进行消融研究(ablation study),可以了解pairing loss本身相对于干净配对(clean pairs)和对抗配对(adversarial pairs)形成的贡献。

令人惊讶的是,研究表明,在随机pairs of logits中引入相似性,会使得基于MNISTSVHN的模型具有较高的鲁棒性。这表明单就CLP似乎就是一个值得研究的点。

ALPCLP最终的优化表达式中,都是一个最小化过程(minimizing the loss),那么对于λL(f(x),f(x′))\lambda L(f(x),f(x'))λL(f(x),f(x′))式,即减小二者之间的相似性。

4.2.3 clean logit squeezing

因为CLP会导致较高的精度,我们假设此时模型正在学习去预测较小辐值的logits,因此会被惩罚不至于过度自信。

5. Adversarial logit pairing results and discussion

看结果,首先是在小数据集上的表现(5.1和5.2节);然后才是本文的中心,在ImageNet上的效果(5.3节)。

5.1 Results on MNIST

首先将ALP应用于MNIST数据集。

关于logit pairing权重的设置(λ\lambdaλ),实验发现λ\lambdaλ的大小不要求那么精确,只要落在[0.2, 1]之间的任意值即可。

  • 只要有logit pairing的添加,模型在对抗样本上的精度,相对一般的对抗训练得到模型就会得以提升。最终实验使用的是λ=1\lambda=1λ=1,即交叉熵和logit pairingloss权重相等。
  • 其次,在MNIST使用的模型是Madry使用的LeNet,即两个卷积核(卷积核后接2x2最大池化)+全连接层。
    • 攻击方法是PGD
    • ϵ=76.5/255.0(0.3)\epsilon = 76.5/255.0(0.3)ϵ=76.5/255.0(0.3);α=2.55/255(0.01)\alpha = 2.55/255(0.01)α=2.55/255(0.01);
    • steps=40,with 1 random restart.

ALP方法获得了比之前方法更好的效果。

5.2 Results on SVHN

实验设置:

  • PGD-attack
  • .ϵ=12.0/255\epsilon=12.0/255ϵ=12.0/255,α=3/255.0\alpha=3/255.0α=3/255.0;
  • steps=10
  • 模型使用的是RevNet-9。特征:
    • ResNet一样,是由ResNet块组成的,精度也和之相似;
    • 区别在于RevNet更节省内存,它使用的时候所需要的内存是个常数,不会随着网络层数而变化,使用的目的也是为了能适用于大batch_size情况,快速收敛。

MNIST数据集上的规律类似,对于λ\lambdaλ的选择设置没有那么敏感,只要求在[0.5, 1]之间即可,最终设置λ=0.5\lambda=0.5λ=0.5。

5.3 Results on ImageNet

5.3.1 Motivation

首先,之前的工作鲜有基于ImageNet数据集的。在Adversarial machine learning at scale中,作者也发现,基于单步迭代方法对抗训练,最终也只能对单步攻击方法鲁棒。即使是基于多步迭代的攻击方法进行对抗训练仍然不起作用。

Madry文章中也只对MNISTCIFAR10数据集,并没对ImageNet对抗训练。

本文首先使用Madry方法在ImageNet数据集上开展了对抗训练,然后使用了本文的方法进行了对比。

5.3.2 Implementation details

对抗训练最终的训练花销与攻击方法中的攻击迭代步息息相关,因为每一次迭代都需要做一次完整的反向传播(BP)。这样,总的计算量其实可以根据干净样本上的训练花销和迭代步简单乘法得到。而且似乎目前也没有什么特别有效地优化方法可提速,对于ImageNet更是。

一些设置:

  • 首先使用了53个工作站进行同步训练,其中50个用来梯度计算,另外3个用来备份,每个工作站是一张p100卡;
  • 尝试了异步梯度更新,但是发现收敛效果并不好。另外,使用了CPUs上运行的17个参数服务器;
  • 另外发现大的batch也有利于对抗训练,最大为1600.
  • 为了更好的和Adversarial machine learning at scale进行比较,使用的是Inception V3模型对抗训练;
  • 使用RMSProp优化算法。初始学习率为0.045,学习每两个epochs指数下降,momentum=0.9
  • 最终,使用的Cleverhans library进行对抗攻击。

5.3.3 Targeted VS Untargeted attacks

对于ImageNet,目标攻击较无目标攻击更有意义。Adversarial machine learning at scale

原因:在ImageNet数据集上,无目标攻击会导致非常相似的分类结果,例如两个不同品种的狗,但是这如果作为攻击的分类结果,似乎意义不大。(限定在ImageNet数据集上,其他数据集有没有这个特征还不确定)

5.3.4 Results and discussion

Results with adversarial logit pairing.

  • 所有的给出的accuracy都是最差情况下的accuracy
  • 使用了多种攻击方法“
    • Step-LL
    • Step-Rand
    • R+Step-LL
    • R+Step-Rand
    • Iter_Rand
    • Iter-LL
    • PGD-Rand
    • PGD-LL

RandLL分别表示将类别攻击random classlease likely class(定义在Adversarial machine learning at scale))

对于多步攻击方法(Multi-step attacks),改变不同的总扰动大小、每一步的扰动大小和最终的迭代步:

  • ϵ\epsilonϵ:16/255.0,同时设置一个[0,1]之间的放缩量;
  • α\alphaα:2/255.0,同时设置一个[0,1]之间的放缩量;
  • steps=10.

所有的精度结果都基于ImageNet validation set


White box

Black box
  • 白盒情况下,使用ALP对抗训练的鲁棒效果最好;
  • 黑盒情况下,Tramer et al. (2018)`得到的效果略佳。

Damaging Ensemble Adversarial Training.

首先,使用Ensemble adversarial trainingImageNet上进行黑盒攻击,获得了66.6%的鲁棒结果。

本文使用了其它的攻击方法较大的影响了这个结果。

首先,使用ALP进行对抗训练,同时基于这个模型得到了对抗样本作为攻击的transfer attack

发现,在所有使用的这些攻击方法中,使用Iter-Rand attack攻击效果最好,此时将模型的鲁棒性从66.6%降到了47.1%

一个可能的原因是:Iter-Rand是从一个多步对抗训练模型中得到的对抗样本,而被攻击的ensemble adversarial training是基于单步或两步攻击方法对抗训练得到的,因此相对来说,此时得到的对抗样本攻击性更强。同时,在Madry的结果中也有相似的结论:黑盒攻击对抗样本迁移性更强。

ALP是个不一样的loss function,与具体的攻击方法无关)

因此,

  • 本文的实验结果建议使用完全的迭代攻击方法来提供一个在ImageNet数据集上最差的鲁棒结果(下限)。
  • 在黑盒攻击threat model下,建议使用在多步迭代对抗训练得到的攻击样本来获得最佳的攻击型。

Discussion.

  • 首先,发现使用PGD作为对抗攻击方法,在多工作站同步(with synchronous gradient updates)和大batch_size下模型可以收敛;多步对抗训练表明还是可以提高白盒攻击下的鲁棒性的,但是是从1.5%$\rightarrow $3.9%Kurakin/M-PGD);
  • 其次,本文使用ALP对抗训练大大提高了模型白盒攻击下的鲁棒性3.9%$\rightarrow ‘27.9`27.9%`(`M-PGD/ALP`);同时,在黑盒攻击下,模型的鲁棒性也得以提升`36.5%`‘27.9\rightarrow $46.7%M-PGD/ALP
  • 最后,这些结果表明,白盒攻击下,ALP较之前最好的结果都要好20x个点(这不就是3.9%$\rightarrow $27.9%??);同时,对于黑盒攻击而言,也能达到之前最好的鲁棒性。

why does ALP works so well?

一种可能的解释是,ALP提供了一个额外的先验信息来对模型进行正则化,使得模型能更好的理解各个类别。

使用交叉熵损失函数时:

If we train the model with only the cross-entropy loss, it is prone to learning spurious functions that fit the training distribution but have undefined behavior off the training manifold.

训练得到的模型更倾向于学习符合数据分布的函数,而对流形之外的数据学习的不好(对流形之外的数据具有不确定的行为)。

对抗训练增加了有关空间结构的额外信息。有一个假设:即给干净样本添加细微的扰动应该不会改变模型对其的分类结果(与扰动添加的方向无关)。对抗训练同时引入了其它的先验信息,即使得(迫使)模型选择在更大样本空间内更有意义的函数(即使得模型更加的“大”,更加的复杂,强制把对抗样本包裹在内)。

然而,对抗训练并没有考虑到干净样本和相应的对抗样本之间的关系(联系)。例如,如果原始图片的类别是猫,但是添加扰动后模型会认为这是狗,但是仍然还是要训练模型,使得模型仍然将之分类称猫(这就是常规的对抗训练思路)。但是在这个过程中,却没有任何信息/号来反馈给模型,对抗样本其实和原始干净样本间其实是有相似性的

ALP起到了这么一个作用,即告诉模型干净样本和相应的对抗样本间是相似的。

因为这样的相似性,并强制模型去学习这类相似性特征,一定程度上会鼓励模型来学到真正有意义的logits特征(例如猫的耳朵),并且会忽略一些虚假的特征(颜色,或者一些通过对抗扰动带来的远离manifold的方向特征(off-manifold directions introduced by adversarial perturbations))。

同时,本文也认为这是一个将知识从干净样本蒸馏到对抗样本中的过程(反之亦然)。

同时,与之前MadryCIFAR10数据集上的特点一样,即会降低模型在干净样本上的预测精度,ALP同样存在这样的问题。

5.3.5 Comparison of different architectures

在以前的资料中已经表明,模型的架构和模型的容量对模型的鲁棒性影响很大。

首先,比较了Inception V3容量的影响,这样可以和以前的结果进行对比;

然后引入了ResNet-101网络,来对residual connections对对抗鲁棒性进行研究。

使用ALP训练模型:


White box

Black box

5.4 Clean logit pairing results

MNIST上进行CLP实验。

方法:

  • 首先用高斯噪声来增强图片,然后再应用CLPlogit squeezing
  • 使用PGD攻击。

首先,如下图所示:

  • 两条线,一条是使用CLP,另一条是使用Logit squeezing,可以看出,logit squeezing效果较好;
  • 其次,横坐标是权重参数,和前面的分析是一样的,权重参数存在阈值,但是超过阈值后,影响不那么大;

下面给出了和M-PGD的效果比较。

  • logit squeezing还不能算对抗训练,但是鲁棒性已经很好了,同时在干净样本上精度更高;
  • 对于多步攻击的对抗训练,对抗训练的计算量与迭代步紧密相关,因为每一次迭代都需要对模型进行完全的BP。与之相对。

6. Comparison to other possible approaches

**Label smoothing.**标签平滑,即将原来的硬目标使用软目标替换。例如引入参数δ<1\delta<1δ<1,将正确类别的概率设置为1−δ1-\delta1−δ,而其它类别的概率设置为δ/(N−1)\delta/(N-1)δ/(N−1)。

**Mixup.**通过在训练样本之间插值得到新的样本进行训练。在这些插值点处,输出标签通过类似的插值得到。Mixup可以提高模型的鲁棒性。

比较结果如上所示:

  • ALP效果更好

7. Conclusion and future work

Contributions:

  • 首先,回答了问题,即对抗训练可在ImageNet上操作;
  • 引入了ALP,提高了对抗训练的有效性;
  • 引入了CLPlogit squeezing方法,与对抗训练相比训练开销较小,其增加了鲁棒模型训练的可能性;(CLP方法计算成本低,如果能替代对抗训练,则可大大增加机器学习的应用)
  • 基于使用ALP对抗训练得到的模型生成的对抗样本,攻击型很强,足以对之前Ensemble Adversarial Training训练的模型进行攻击;
  • 我们将ALPPGD结合进行训练进行防御,因为PGD是目前最强的攻击方法,但是ALP同样是可以和其它方法结合的,在将来如果发展了其它更强的攻击方法的话。

看到这里,如果将对抗样本认为是训练分布之外的数据,或者说manifold之外的数据,则通过引入ALP,强制训练增加干净样本和对抗样本间的相似性,方向应该是对的啊。

ALP

Adversarial Logit pairing (ALP)是一种对抗性训练方法,通过对一个干净图像的网络和它的对抗样本进行类似的预测。其思想可以解释为使用干净样本的预测结果作为“无噪声”参考,是对抗样本学习干净样本的特征,以达到去噪的目的。该方法在ImageNet上黑盒、白盒攻击的效果在5.3.4节中给出。

合进行训练进行防御,因为PGD是目前最强的攻击方法,但是ALP同样是可以和其它方法结合的,在将来如果发展了其它更强的攻击方法的话。

看到这里,如果将对抗样本认为是训练分布之外的数据,或者说manifold之外的数据,则通过引入ALP,强制训练增加干净样本和对抗样本间的相似性,方向应该是对的啊。

Adversarial Logit Pairing_CSDN相关推荐

  1. 重磅MIT开源人工智能算法评估和理解对抗Logit配对的稳健性

    重磅MIT开源人工智能算法评估和理解对抗Logit配对的稳健性摘要:我们评估了对抗性Logit Pairing的稳健性,这是最近针对广告范例提出的防御措施. 我们发现,使用Adversarial Lo ...

  2. 【图像分类】 图像分类中的对抗攻击是怎么回事?

    欢迎大家来到图像分类专栏,深度学习分类模型虽然性能强大,但是也常常会因为受到小的干扰而性能崩溃,对抗攻击就是专门研究如何提高网络模型鲁棒性的方法,本文简要介绍相关内容. 作者&编辑 | 郭冰洋 ...

  3. 黑盒攻击的分类_「图像分类」图像分类中的对抗攻击是怎么回事?

    欢迎大家来到图像分类专栏,深度学习分类模型虽然性能强大,但是也常常会因为受到小的干扰而性能崩溃,对抗攻击就是专门研究如何提高网络模型鲁棒性的方法,本文简要介绍相关内容. 作者 | 郭冰洋 编辑 | 言 ...

  4. NIPS 2018 接收论文list 完整清单

    NIPS2018 接收论文包括poster.tutorial.workshop等,目前官网公布了论文清单: https://nips.cc/Conferences/2018/Schedule Post ...

  5. TensorFlow models/research

    模型 描述 a3c_blogpost 增强学习,A3C,小车屹立不倒,文章 adv_imagenet_models 对抗学习,比标准的cnn更具鲁棒性,文章 adversarial_crypto 对抗 ...

  6. 从《西部世界》到GAIL(Generative Adversarial Imitation Learning)算法

    原文链接:https://blog.csdn.net/jinzhuojun/article/details/85220327 一.背景 看过美剧<西部世界>肯定对里边的真实性(fideli ...

  7. 对抗机器学习——FGSM经典论文 EXPLAINING AND HARNESSING ADVERSARIAL EXAMPLES

    EXPLAINING AND HARNESSING ADVERSARIAL EXAMPLES 论文URL http://users.wpi.edu/~kmus/ECE579M_files/Readin ...

  8. 【论文阅读】Feature Denoising for Improving Adversarial Robustness

    阅读由来SCRDet++参考文献[20]https://blog.csdn.net/dujuancao11/article/details/121590324 Feature Denoising fo ...

  9. Adversarial Semantic Hallucination for Domain Generalized Semantic Segmentation

    摘要 当测试数据和训练数据来自不同的领域时,卷积神经网络可能表现不佳.虽然可以通过使用目标域数据对齐源和目标域特征表示来缓解这个问题,但由于隐私问题,目标域数据可能不可用.因此,需要在训练期间不访问目 ...

  10. 对抗机器学习:Generating Adversarial Malware Examples for Black-box Attacks Based on GAN

    论文url https://arxiv.org/pdf/1702.05983.pdf @article{hu2017generating, title={Generating adversarial ...

最新文章

  1. Nginx 静态资源缓存配置
  2. 73岁Hinton老爷子构思下一代神经网络:属于无监督对比学习
  3. 独家|测量、建议、快速上手!你所使用的Python对象占用了多少内存?(附代码)...
  4. 为什么Redis内存不宜过大
  5. Java、Python、Go 哪个后端编程语言适合web前端工程师学习?
  6. 三、Dockerfile的说明和编写
  7. 深度学习-Tensorflow2.2-批标准化简介-14
  8. 回溯python_用Python回溯算法
  9. linux 分卷解压
  10. python 练习 27
  11. sql server 链接服务器 中文乱码_【小问题】Centos服务器下MySQL中文乱码问题
  12. OJ-1:时钟问题【九度1553】
  13. 强行卸载趋势科技防毒墙网络版客户端
  14. 实现winfrom进度条及进度信息提示,winfrom程序假死处理
  15. Bugku-CTF之login3(SKCTF)(基于布尔的SQL盲注)
  16. 如何购买阿里云香港服务器?又有什么什么好处呢?
  17. 有这么一种东西,员工深恶痛绝,老板们却喜爱有加
  18. OpenCvSharp函数:Dilate膨胀、GetStructuringElement获取形态操作的结构元素、Erode腐蚀
  19. 今日头条如何快速开通原创
  20. 东方财富、同花顺、大智慧、通达信的Level2行情接口哪个好?

热门文章

  1. oracle sql 自动补位数
  2. c14cpm和dpm怎么换算_DPM7001液体闪烁计数器
  3. NPN PNP 接近开关
  4. codelite开发php,CodeLite环境搭建
  5. OpenStack 基础知识(学神教育学习笔记)
  6. 移动云平台的基础架构之旅(一):云应用
  7. OUC-SE-BLOG1
  8. 编码,隐匿在计算机软硬件背后的语言读书笔记(作者序)
  9. 反激式开关电源双环PID(电压环+电流环)控制之MATLAB仿真
  10. 我的老公-追忆似水流年