《VERY DEEP CONVOLUTIONAL NETWORKS FOR LARGE-SCALE IMAGE RECOGNITION (VGG) 2014》

abstract

在这项工作中,作者研究了卷积网络深度对其在大规模图像识别设置中的准确性的影响。其主要贡献是:使用非常小(3 × 3)卷积滤波器的架构,对更深的网络进行了全面评估,通过将网络的深度加深至16-19个权重层,可以实现对现有技术配置的显著改进。

这些发现是我们提交2014 ImageNet挑战赛的基础,我们的团队分别在定位和分类轨道中获得了第一和第二名。我们还表明,我们的表示可以很好地推广到其他数据集,在这些数据集中,它们实现了最精确的结果。

我们已经公开了两个性能最好的ConvNet模型,以促进在计算机视觉中使用深度视觉表示的进一步研究。

Introduce

卷积网络(ConvNets)最近在大规模图像和视频识别方面取得了巨大成功,这基于了大型公共图像存储库,如ImageNet和高性能计算系统,如gpu或大规模分布式集群。特别是,ImageNet大规模视觉识别挑战赛(ILSVRC) 在深度视觉识别体系结构的发展中发挥了重要作用,它已作为几代大规模图像分类系统的测试平台,从高维浅特征编码到深度ConvNets。

随着ConvNets在计算机视觉领域变得越来越重要,为了获得更好的精度,已经做出了许多尝试来改进Krizhevsky等人于2012年提出的原始架构。例如Zeiler & Fergus向ILSVRC提交了表现最佳的作品,他们利用了更小的感知窗口和更小的第一卷积层步幅。

另一项论文《Sermanet et al. 2014》提出的改进涉及了在整个图像和多个尺度上密集地训练和测试网络。

在本文中,我们讨论了ConvNet体系结构设计的另一个重要方面——深度。为此,我们固定了架构的其他参数,并通过增加更多的卷积层来逐步增加网络的深度,这是可行的,因为在所有层中都使用了非常小的(3 × 3)卷积滤波器。

而结论是,我们提出了更准确的卷积网络架构,不仅在ILSVRC分类和定位任务上达到了最先进的精度,而且也适用于其他图像识别数据集,即使作为相对简单的pipelines的一部分使用(例如,不进行参数微调的线性SVM深度特征分类器),也取得了出色的性能。我们发布了两个表现最好的模型,以促进进一步的研究。

论文的其余部分如下。在第2节中,我们描述了卷积网络的配置。在第3节中详细介绍了图像分类的训练和评估,并在第4节中对ILSVRC分类任务上的配置进行了比较。第5节收尾。为了完整性,我们还在附录A中描述和评估了我们的ILSVRC-2014的目标定位系统,并在附录b中讨论了将该深度神经网络的训练好的特征推广到其他数据集的情况。

2 CONVNET CONFIGURATIONS

为了在对照实验中衡量增加的卷积网络深度带来的改善,我们所有的卷积网络层配置都使用相同的原则设计,这是受到Ciresan;Krizhevsky等人的启发。在本节中,我们首先描述卷积网络配置的一般布局(第2.1节),然后详细描述评估中使用的特定配置(第2.2节)。然后,我们将在2.3节中讨论并与现有的技术进行比较。

2.1 ARCHITECTURE

在训练过程中,我们卷积网络的输入是一个固定大小的 224 × 224 RGB图像。我们所做的唯一预处理是:每个图片的像素减去在训练集上计算的平均RGB值。

图像经由多个卷积层逐步传递,其中我们使用具有非常小的 3 × 3 滤波器(这是捕获左/右、上/下、中概念的最小尺寸)。在其中一种配置中,我们还使用了1 × 1卷积滤波器,这可以被视为输入通道的线性变换(其余是非线性的)。

卷积步长固定为1像素。

卷积层输入的空间填充是这样的:采用 Same padding,即对3 × 3滤波器采用1像素的填充。

空间池化由5个最大池化层进行,它们遵循一些卷积层(并非所有的卷积层都遵循最大池化)。最大池化在2 × 2像素窗口上执行,步幅为2。

卷积层的堆栈(在不同的体系结构中具有不同的深度)之后是三个全连接(FC)层:前两个各有4096个通道,第三个执行1000路soft-max层,以进行ILSVRC分类(每个类一个)。全连接层的配置在所有网络中都是相同的。

所有隐藏层都配备了 Relu 进行非线性修正。我们注意到,我们的网络(除了一个网络)都不包含 Local Response Normalisation (LRN): 如第4节所示,这种归一化不会提高ILSVRC数据集的性能,但会导致内存消耗和计算时间增加。在适用的情况下,LRN层的参数参考了Krizhevsky等人2012的研究。

2.2 CONFIGURATIONS

img

本文评估的卷积网络配置概述在表1中。下面我们将以A-E替代来介绍神经网络。所有配置遵循2.1节中介绍的通用设计,仅在深度上有所不同:从网络A的11个权重层(8个卷积层和3个FC层)到网络E的19个权重层(16个卷积层和3个FC层)。卷积层(通道数)的宽度相当小,从第一层的64开始,然后在每个最大池化层后增加2倍,直到达到512。

在表2中,我们报告了每种配置的参数数量。尽管深度很大,网络中的权重数量并不大于卷积层宽度和感受野更浅的网络中的参数数量(Sermanet et al., 2014 就包含了 144 millions 的参数)。

2.3 DISCUSSION

我们的ConvNet配置与其他ILSVRC比赛中表现最好的网络所使用的配置有很大不同。我们在整个网络中使用非常小的3 × 3感受野,步幅为1。

很容易看到,两个3×3卷积层(卷积层之间没有空间池化)的有效感受野为5×5;三个这样的3×3卷积层具有7 × 7的有效感受野。

这里不懂的可以去查一下感受野计算,概念和计算都还是蛮简单的。

那么为什么选择三个3×3卷积层组成的堆栈而不是一个单独的7×7层?

这样做带来两个好处:1.参数量减小;2.结合多个非线性操作使得决策函数更具判别性。例如:3个3×3的卷积层参数量只有7×7卷积层的0.55倍((3*3*3)/(7*7)=0.55),但前者有3个非线性操作,后者只有1个非线性操作,使得前者学习特征的能力变强。

言下之意,加深神经网络提高分类精度的本质在于 “更多的非线性操作”。下文中添加 1x1 卷积层的目的也是为了 “更多的非线性操作”。

采用1×1卷积层(配置C,表1)是一种增加决策函数非线性而不影响卷积层感受野的方法。甚至尽管在我们的例子中,1×1卷积本质上是到相同维度空间上的线性投影(输入和输出通道的数量是相同的),但整改函数(比如Relu)引入了额外的非线性。值得注意的是,1×1的滤波器最近被用于Lin等人(2014)实验的架构中。

Ciresan等人(2011)之前也使用过小尺寸的卷积滤波器,但他们的网络深度明显小于我们的网络,并且没有在大规模ILSVRC数据集上进行评估。Goodfellow等人(2014)将深度卷积网络(11个权重层)应用于街道编号识别任务,并表明深度的增加可以带来更好的性能。

GoogLeNet(Szegedy et al., 2014)是ILSVRC-2014分类任务中表现最好的神经网络,是独立于我们的工作开发的,它也属于非常深的卷积网络(22权值层)和小卷积滤波器(除了3×3,它们还使用1×1和5×5卷积)。不同在于,他们的网络拓扑比我们的更复杂,特征图的空间资源解决方案在第一层中更积极地减少以减少计算量。两个模型的对比在4.5节所示,结论是我们的模型优于Szegedy等人的模型。

3 CLASSIFICATION FRAMEWORK

在上一节中,我们介绍了网络配置的细节。在本节中,我们描述了卷积网络训练和评估分类的细节。

3.1 TRAINING

ConvNet的训练过程通常遵循Krizhevsky等人(2012)(除了从多尺度训练图像中对输入裁剪图像进行采样外,下文解释)。

即:训练是通过使用momentum的小批量梯度下降优化多项逻辑回归目标来进行的。批量大小设置为256,动量设置为0.9。训练通过权重衰减(L2惩罚乘子设置为5·10^-4)和前两个全连接层的dropout正则化(dropout ratio设置为0.5)进行正则化。 学习速率最初设置为10^−2,然后当验证集精度停止提高时,学习率下降到原来的10倍。总的来说,学习率降低了3倍,在370K次迭代(74 epochs)后停止学习。

我们推测,尽管与(Krizhevsky等人,2012)相比,我们的网络参数数量更多,深度也更大,这是由于
(a)隐含正则性,网络需要更少的迭代次数才能收敛
(b)预先初始化某些层

网络权重的初始化很重要,因为在深度网络中,由于梯度的不稳定性,糟糕的初始化可能会导致学习停滞。为了规避这个问题,我们开始训练配置A(表1),它足够浅,可以用随机初始化进行训练。

当训练更深层次的架构时,我们使用网络A的层初始化前4个卷积层和后3个全连接层(中间层随机初始化)。我们没有降低预初始化层的学习率,允许它们在学习过程中改变。对于随机初始化(在适用的情况下),我们从均值为0和方差为10^−2的正态分布中采样权重。偏差初始化为零。值得注意的是,在论文提交后,我们发现可以使用Glorot & Bengio(2010)的随机初始化过程来初始化权重,而无需预训练。

为了获得固定大小的224×224 ConvNet输入图像,将从重新缩放的训练图像中随机裁剪(每次SGD迭代会对每张图像进行一次裁剪)。为了进一步增强训练集,裁剪图像进行了随机水平翻转和随机RGB颜色偏移(Krizhevsky等人,2012)。训练图像的缩放解释如下。

Training image size 设S是各向同性缩放的训练图像的最小边,卷积网络输入由此裁剪(我们也称S为训练尺度)。当图像大小固定为224×224时,原则上S可以取不小于224的任何值:对于S = 224,作物将捕获全图像统计,完全跨越训练图像的最小边;对于S >> 224来说,裁剪图像的一小部分,其中包含一个小物体或物体的一部分。

解释一下什么是各向同性缩放 isotropically-rescaled

当图片尺寸不匹配时,我们需要对图像进行缩放。这里缩放有两种策略

各向同性缩放( 也叫:等比缩放),长宽缩放比例相同,好处是不破坏原图的比例

各向异性缩放(也叫:直接变化),直接调整图像尺寸,不考虑图像物体是否发生形变
img

我们考虑两种设置训练尺度S的方法。第一种是固定S,这对应于单尺度训练(注意,采样裁剪图像中的图像内容仍然可以表示多尺度图像的统计信息)。在实验中,评估了在两个固定尺度下训练的模型:

  1. S = 256(这在现有技术中被广泛使用)
  2. S = 384

给定ConvNet配置,我们首先使用S = 256训练网络。为了加速S = 384网络的训练,使用S = 256预训练的权重对其进行初始化,并使用较小的初始学习率10^−3。

设置S的第二种方法是多尺度训练,通过从一定范围[Smin, Smax](我们使用Smin = 256和Smax = 512)随机采样S,分别对每个训练图像进行重新缩放。由于图像中的对象具备不同的大小,因此在训练过程中考虑这一点是有益的。这也可以被视为通过尺度抖动进行训练集增强,其中单个模型被训练以识别大范围内的物体。出于速度的原因,我们通过微调具有相同配置的单尺度模型的所有层来训练多尺度模型,固定S = 384进行预训练。

3.2 TESTING

在测试时,给定一个经过训练的卷积网络和一个输入图像,按以下方式分类。首先,它被各向同性地缩放到预定义的最小图像边,记为Q(我们也称它为测试尺度)。我们注意到,Q不一定等于训练量表S(我们将在第4节中展示,对每个S使用多个Q值可以提高性能)。然后,以类似于(Sermanet et al., 2014)的方式,将网络密集应用于重新缩放的测试图像上。即,首先将全连接层转换为卷积层(第一个FC层转换为7 × 7卷积层,最后两个FC层转换为1 × 1卷积层)。然后将得到的全卷积网络应用于整个(未裁剪)图像。结果是一个类分数图,其中通道数量等于类的数量,以及一个可变的空间分辨率,依赖于输入图像大小。最后,为了获得图像的类分数的固定大小的向量,对类分数图进行空间平均(和池化)。我们还通过水平翻转图像来扩充测试集;对原始图像和翻转图像的soft-max类后验进行平均,以获得图像的最终得分。

由于全卷积网络应用于整个图像,不需要在测试时对多个作物进行采样(Krizhevsky等人,2012),由于需要对每个作物重新计算网络,效率较低。与此同时,使用Szegedy等人(2014)所做的大量作物可以提高精度,因为与全卷积网络相比,它可以对输入图像进行更精细的采样。此外,由于不同的卷积边界条件,多作物评估与密集评估是互补的:当将卷积网络应用于作物时,卷积特征图用零填充,而在密集评估的情况下,同一作物的填充自然来自图像的邻近部分(由于卷积和空间池化),这大大增加了整体网络感受野,因此捕获了更多的上下文。虽然我们认为在实践中,多种作物增加的计算时间并不能证明其潜在的准确性提高,但作为参考,我们还使用每个尺度50种作物(5 × 5规则网格,2次翻转)来评估我们的网络,3种尺度共150种作物,这与Szegedy等人(2014)使用的4种尺度144种作物相当。

3.3 IMPLEMENTATION DETAILS

我们的实现源自公开可用的c++ Caffe工具箱(Jia, 2013)(在2013年12月扩展),但包含许多重大修改,允许我们在单个系统中安装的多个gpu上进行训练和评估,以及在多个尺度的全尺寸(未裁剪)图像上进行训练和评估(如上所述)。多GPU训练利用数据并行性,通过将每批训练图像分割为多个GPU批,在每个GPU上并行处理来实现。计算GPU批处理梯度后,对它们进行平均以获得整个批处理的梯度。梯度计算是跨GPU同步的,因此结果与在单个GPU上训练时完全相同。

虽然最近(Krizhevsky, 2014)提出了加速卷积网络训练的更复杂的方法,对网络的不同层采用模型和数据并行,但我们发现,与使用单个GPU相比,我们这种更简单的方案已经在现成的4-GPU系统上提供了3.75倍的加速。在配备了四个NVIDIA Titan Black gpu的系统上,训练单个网络大概需要2-3周,具体时长还取决于架构。

4 CLASSIFICATION EXPERIMENTS

Dataset.
在本节中,我们介绍了所述ConvNet架构在ILSVRC-2012数据集上实现的图像分类结果。该数据集包括1000个类的图像,并分为三组:训练(1.3M图像)、验证(50K图像)和测试(100K带有类标签的图像)。性能用两个指标来评估:top-1误差和top-5误差。前者是多类分类误差,即错误分类图像的比例;后者是ILSVRC中使用的主要评价标准,其计算方法为ground-truth类别在前5个预测类别之外的图像比例。

对于大多数实验,我们使用验证集作为测试集。某些实验也在测试集上进行,并作为ILSVRC-2014竞赛的“VGG”团队提交给官方ILSVRC服务器(Russakovsky et al., 2014)

4.1 SINGLE SCALE EVALUATION

我们首先用第2.2节中描述的层配置在单个尺度上评估单个ConvNet模型的性能。

测试图像大小设置为:对于常量S,Q = S;对于变量S∈[Smin, Smax],Q = 0.5(Smin + Smax)。结果如表3所示。

img

首先,我们注意到 A-lrn 与 A 并没有太大错误率区别。因此,我们没有在更深层次的架构(B-E)中使用归一化。

其次,我们观察到分类误差随着ConvNet深度的增加而减小。值得注意的是,尽管深度相同,配置C(包含3个1×1卷积层)的性能比配置D(在整个网络中使用3×3卷积层)差。这表明,虽然额外的非线性确实有帮助(C优于B),但通过使用具有non-trivial的感受野的卷积过滤器来捕获空间上下文也很重要(D优于C)。

当深度达到19层时,我们架构的错误率就饱和了,但更深的网络可能对更大的数据集有益。我们还比较了B与带有5个5×5卷积层的浅网络,后者由B衍生而来,通过将每对3×3卷积层替换为单个5×5卷积层(2.3节中解释的,二者具有相同的感受野)。浅网的top-1误差比B高7%,这证实了带小过滤器的深网络优于带大过滤器的浅网络。

最后,训练时的尺度抖动(S∈[256;512])比在具有固定最小边(S = 256或S = 384)的图像上进行训练得到了明显更好的结果,即使在测试时使用单一尺度。这证实了通过尺度抖动增强训练集确实有助于捕获多尺度图像统计。

4.2 MULTI-SCALE EVALUATION

在评估了单一尺度的ConvNet模型后,我们现在评估测试时尺度抖动的影响。它包括在测试图像的几个缩放版本上运行模型(对应于不同的Q值),然后对得到的类后验进行平均。考虑到训练规模和测试规模之间的较大差异会导致性能下降,使用固定S训练的模型在三种测试图像大小上进行评估,接近训练图像大小:Q = {S−32,S, S + 32}。同时,训练时的尺度抖动使网络在测试时适用于更大的尺度范围,因此使用变量S∈[Smin;我们在更大的数据集范围Q = {Smin, 0.5(Smin + Smax), Smax}中进行了评估。

表4中的结果表明,测试时的尺度抖动可以带来更好的性能(与在单一尺度下评估相同模型相比,如表3所示)。和之前一样,最深度的配置(D和E)表现最好,尺度抖动优于使用固定的最小边s进行训练。我们在验证集上的最佳单网络性能是24.8%/7.5% top-1/top-5误差(表4中加粗显示)。配置E达到了7.3%的top-5错误。

4.3 MULTI-CROP EVALUATION

在表5中,我们将密集卷积网络评估与多种作物评估进行了比较(关于detail,请参见第3.2节)。本文还通过平均两种评估技术的软max输出来评估它们的互补性。可以看出,使用多种作物的表现略好于密集评估,这两种方法确实是互补的,因为它们的组合优于它们中的任何一种。如上所述,我们假设这是由于对卷积边界条件的不同处理。

img

4.4 CONVNET FUSION

到目前为止,我们评估了单个卷积网络模型的性能。在实验的这一部分iments中,我们通过平均它们的soft-max类后验来组合几个模型的输出。由于模型的互补性,这提高了性能,并在2012年(Krizhevsky等人,2012)和2013年(Zeiler & Fergus, 2013;Sermanet et al., 2014)。

结果如表6所示。在ILSVRC提交时,我们只训练了单尺度网络和多尺度模型D(通过只微调全连接层而不是所有层)。由7个网络组成的集成模型的ILSVRC测试误差为7.3%。在提交后,我们只考虑了两个表现最好的多尺度模型(配置D和E)的集成,使用密集评估将测试误差降低到7.0%,使用组合密集和多作物评估将测试误差降低到6.8%。作为参考,我们表现最好的单个模型达到了7.1%的误差(模型E,表5)。

img

4.5 COMPARISON WITH THE STATE OF THE ART

从表7可以看出,我们的非常深的卷积网络显著优于上一代模型,这在ILSVRC-2012和ILSVRC-2013竞赛中取得了最好的结果。与分类任务冠军相比,该结果也具有竞争力(GoogLeNet,错误6.7%),并大大优于ILSVRC-2013获奖作品Clarifai,在外部训练数据下实现了11.2%,在没有外部训练数据的情况下实现了11.7%。这是值得注意的,考虑到我们仅通过组合两个模型就取得了最好的结果——比大多数ILSVRC提交中使用的要少得多。就单网络性能而言,我们的架构取得了最好的结果(7.0%的测试错误),比单个GoogLeNet高出0.9%。值得注意的是,我们没有脱离LeCun等人(1989)的经典卷积网络架构,而是通过大幅增加深度来改进它。

img

5 CONCLUSION

在这项工作中,我们评估了深度卷积网络(多达19个权重层)用于大规模规模的图像分类。实验证明,深度有利于提高分类精度,使用深度大幅增加的传统的卷积网络架构可以在ImageNet挑战数据集上取得最先进的性能。在附录中,本文所提出模型在广泛的任务和数据集上都有很好的泛化能力,匹敌甚至超越了基于不太深的图像识别神经网络。结果再次证实了深度在视觉表示中的重要性。

ACKNOWLEDGEMENTS

...

REFERENCES

...

A LOCALISATION

在本文的主体部分,我们讨论了ILSVRC挑战的分类任务,并对不同深度的卷积网络架构进行了彻底的评估。在本节中,我们讨论挑战目标定位任务,我们在2014年以25.3%的误差获胜。该挑战可以看作是对象检测的一个特殊情况,对于top-5类中的每一类,需要预测一个单一的目标边界框,而不需考虑每一类目标的实际数量。

img

为此,我们采用ILSVRC-2013本地化挑战的获胜者Sermanet et al.(2014)的方法,并进行了一些修改。我们的方法在A.1节中描述,在A.2节中评估。

A.1 LOCALISATION CONVNET

为了进行对象定位,我们使用一个非常深的卷积网络,其中最后一个全连接层预测边界框位置而不是类分数。边界框由存储其中心坐标、宽度和高度的4-D向量表示。

边界框存储是取决于任务是单类回归还是每类回归。在前一种情况下,全连接层最后一层是4-D,而在后一种情况下是4000-D(因为数据集中有1000个类,比如上图就属于每类回归)。除了最后一个边界框预测层,其余结构都使用卷积网络结构D(表1),它包含16个权重层,在分类任务中表现最好(表4)。

目标定位卷积网的训练与分类卷积网的训练类似(第3.1节)。主要区别在于,我们将逻辑回归目标损失替换为欧氏损失,该损失取决于预测边界框参数与真实值的偏差。

我们训练了两个目标定位模型,每个都在单一尺度上:S = 256和S = 384(由于时间限制,我们在ILSVRC-2014提交的文件中没有使用训练尺度抖动)。训练用相应的分类模型初始化(在相同的尺度上训练),初始学习率设置为10−3。我们探索了微调所有层和只微调前两个全连接层,如Sermanet et al., 2014年所做的那样。最后一个全连接层是随机初始化的,并从头开始训练。

本文转载于网络 如有侵权请联系删除

相关文章

  • 面试系列-3 限流场景实践

    英国弗兰明曾说过一句话:“不要等待运气降临,应该去努力掌握知识。”1前言大家好,我是阿沐!你的收获便是我的喜欢,你的点赞便是对我的认可。今天呢,我们就不聊redis面试系列,我们一起来聊一聊限流操作以及使用场景。很奇怪哈,为啥突然转变画风了,之前一篇文章中提到redis的限流操作,并没有实际给小伙伴们演示以及场景的使用演练。所以呢,既然有人私聊问我了,那么今天我们来聊一聊这个。当然想写这篇文章并不是空穴来风,实际的面试场景中是会被面试官问及到。一般一个成熟的公司它的限流是通过一个中台服务(此中台并非阿里出的中台,其实就是一个网络上游服务),你app的所有请求都要经过上游的验证、检测处理,如果配置了哪些接口限流,那么它就能自动监控告警,然后才去限流、降低、熔断措施。可是并不是很多公司都有一套这种规范流程,所以大部分还是基于redis做简单版的限流服务。好吧,开始新的面试侧重点!2什么是接口限流面试官:“经验一年,不会不知道什么是限流操作吧”。可以说一说你对限流的理解嘛?面试者:“卧槽,过分了呀,我之前可是在外包公司,用户数不多,流量也并不大,qps更不提了,这分明是在搞我,要我搬出理论知

  • Redis命令

    1.String常用命令2.list常用命令特点: 存取有序、有下标、允许重复 存值命令说明lpushkeyvalue[value…]从列表的头部插入数据rpushkeyvalue[value…]从列表的尾部插入数据取值命令说明lrangekeystartstop获取指定列表的从start开始查看到stop的全部数据,stop为-1,代表最后一个lpopkey从头部移除数据rpopkey从尾部移除数据其他操作命令说明lremkeycountvalue删除当前列表中count个value,count>0从头删,count<0从尾删,count=0,删除全部3.set常用命令特点: 存取无序、无下标、不允许重复4.zset常用命令5.Java操作Redis

  • 数据库-数据操作

    1.7数据操作1.7.1插入数据语法:insertinto表名(字段名,字段名,…)values(值1,值1,…)1、插入所有字段--插入所有字段 mysql>insertintostu(id,stuname,sex,`add`)values(1,'tom','男','北京'); QueryOK,1rowaffected(0.00sec) --插入部分字段 mysql>insertintostu(id,stuname)values(2,'berry'); --插入的字段和表的字段可以顺序不一致。但是插入字段名和插入的值一定要一一对应 mysql>insertintostu(sex,`add`,id,stuname)values('女','上海',3,'ketty'); QueryOK,1rowaffected(0.00sec) --插入字段名可以省略 mysql>insertintostuvalues(4,'

  • 分布式系统理论基础开篇:从放弃到入门

    本文转自https://www.cnblogs.com/bangerlee/p/6216997.html本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看https://github.com/h2pl/Java-Tutorial喜欢的话麻烦点下Star哈本文也将同步到我的个人博客:www.how2playlife.com该系列博文会告诉你什么是分布式系统,这对后端工程师来说是很重要的一门学问,我们会逐步了解分布式理论中的基本概念,常见算法、以及一些较为复杂的分布式原理,同时也需要进一步了解zookeeper的实现,以及CAP、一致性原理等一些常见的分布式理论基础,以便让你更完整地了解分布式理论的基础,为后续学习分布式技术内容做好准备。如果对本系列文章有什么建议,或者是有什么疑问的话,也可以关注公众号【Java技术江湖】联系作者,欢迎你参与本系列博文的创作和修订。随承载用户数量的增加和容灾的需要,越来越多互联网后台系统从单机模式切换到分布式集群。回顾自己毕业五年来的工作内容,同样有这样的转变。毕业头两年负责维护运行在刀片机上的业务,在机房里拔插

  • R语言:斐波那契数列

    用R语言实现斐波那契数列 #斐波那契数列 #1,1,2,3,5,8,13,21,34,.... a=1;b=1 qing<-function(x){ for(iin1:5){ print(a) c=a+b a=b b=c } } qing(5) [1]1 [1]1 [1]2 [1]3 [1]5 #c=a+b将a+b赋值给c #a=b把b赋值给a,a原来的值被覆盖掉 #b=c把c赋值给b,b原来的值被覆盖掉 #a是更新最慢的,从而将每个数都给打印出来 ###这里采用了循环,是为了提示运行次数或兔子问题中的繁殖代数 a=1;b=1;i=0 wo<-function(x){ while(i<=x){ print(a) c=a+b a=b b=c i=i+1 } } wo(5) [1]1 [1]1 [1]2 [1]3 [1]5 [1]8 ##和第一个类似 wo<-function(x){ if(x==1||x==2){ return(1) }else{ return(qing(x-1)+qing(x-2)) } } wo(6) [1]8 ##采用了递

  • UC Berkeley 讲座教授王强:Deep Learning 及 AlphaGo Zero(下)

    AI科技评论按:北京时间10月19日凌晨,DeepMind在Nature上发布论文《MasteringthegameofGowithouthumanknowledge》(不使用人类知识掌握围棋),在这篇论文中,DeepMind展示了他们更强大的新版本围棋程序“AlphaGoZero”,掀起了人们对AI的大讨论。而在10月28日,GeoffreyHinton发表最新的胶囊论文,彻底推翻了他三十年来所坚持的算法,又一次掀起学界大讨论。究竟什么是人工智能?深度学习的发展历程如何?日前,AI科技评论邀请到UCBerkeley机器人与工程实验室讲座教授王强博士,他为大家深入浅出讲解了何为人工智能,深度学习的发展历程,如何从机器感知向机器认知演进,并解析了AlphaGo与AlphaGoZero的原理、学习过程、区别等。嘉宾简介:王强博士,本科毕业于西安交通大学计算机科学与技术专业,后获得卡内基梅隆大学软件工程专业硕士学位、机器人博士学位。美国货币监理署(OCC)审计专家库成员、IBM商业价值研究院院士及纽约ThomasJ.Watson研究院主任研究员。IEEE高级会员,并担任了2008、2009、

  • 桥接模式

    桥接模式要把握的很重要的一点就是:类的继承关系和类的组合/聚合关系,何时应该考虑使用何种关系。是不是在编程过程中一味地使用类的继承关系就代表这就是面向对象编程了?有时候并不是这样,Java的类继承设计成单继承模式我想应该就是不想把类的继承关系搞得过于复杂,实际上我们应该优先使用对象组合/聚合,而不是类继承。类继承不必我们多说,我们来看看何为组合/聚合关系。当我们看到上图过后应该能明白什么是组合和聚合了。聚合体现的是“弱”的拥有关系,比如雁群可以包含大雁,但雁群不是大雁的一部分。组合体现的是“强”的拥有关系,或者体现的是部分与整体的关系,通过一对翅膀组合成大雁,翅膀是部分,大雁是整体。在了解了什么是组合/聚合过后,我们来看看什么是桥接模式。同样我们通过《大话设计模式》书中的例子来说明。在N多年前手机还未像现在的手机市场一样,由Android和iOS一统天下。N年前各个手机厂商的软件几乎是互不兼容,更严重的可能是同一个手机厂商不同型号的手机也互不兼容。如果我们考虑这种场景应该如何来设计我们的代码呢?我们通过手机品牌来分类。这就是我们通过类继承造成的结果。如果现在需要新增一个手机品牌S的话,

  • ElasticSearch聚合之管道聚合(Pipeline Aggregation)

    管道聚合 让上一步聚合的结果作为下一个聚合的输入,类似stream()流的操作,当不上终结操作时,每次操作的流都作为下次操作的输入 管道类型有很多种不同类型,每种类型都与其他聚合计算不同的信息,但是可以将这些类型分为两类 父级父级聚合的输出提供了一组管道聚合,它可以计算新的存储桶或新的聚合以添加到现有存储桶中 兄弟同级聚合的输出提供管道,并且能够计算与该同级聚合处于同一级别的新聚合 管道聚合可以通过使用bucket_path参数来指示到所需度量的路径,从而引用执行计算所需的聚合。定义这些路径的语法可以在下面的bucket_path语法部分中找到。 比如前置聚合为Bucket聚合,后置聚合为Metric聚合,它可以成为一类管道,进而出现了xxxbucket如Maxbucket,在我们使用中,管道聚合也不少数 大多数管道聚合需要另一个聚合作为其输入。输入聚合通过bucket_path参数定义,该参数遵循特定格式: AGG_SEPARATOR=`>`; METRIC_SEPARATOR=`.`; AGG_NAME=<thenameoftheaggregation>; M

  • FileUpload拦截器

    a)原理:首先FileUpload拦截器将表单中提交的文件,以临时文件的形式保存到服务器临时路径下。之后FileUpload拦截器将该临时文件对象注入给Action,Action自主处理该临时文件。最后FileUpload拦截器删除临时文件。     b)使用步骤       导包commons-io.jar       Action:定义File类型属性(如some),接受拦截器注入的临时文件对象。若想要获取原始文件名,要定义String类型属性,属性名为File类型属性+FileName(如someFileName)       表单设置:method="post",enctype="multipart/form-data"     c)设置限制(Struts2文件上传默认最大值为2097152B,即2M)       在struts.xml中重置默认限制值

  • 目录

    质数的和与积 求阶乘的和 级数求和 求平均年龄 质数判断阶乘 A+BProblem 温度表达转换 字符菱形 判断一个数能否同时被3和5整除 字符三角形 计算邮资

  • NoSql数据库redis之string篇

     为什么要使用redis 因为mysql是存储在硬盘上的,硬盘的读取效率低,redis是处于内存上,mysql之间表的关系错综复杂,redis是关系简单的key-value数据库,表面看起来像是一个map   使用 因为是key-value,所以就是一个key对应一个值,string这里是一个字符串 基本命令    由这张图就能看出 命令含义 setkeystring:    给一个key,设置一个string的值 getkey:       得到key对应的值,如果没有设置为nil msetkeystring...:   设置多个keystring mgetkey....:       得到多个key的值 strlen  :       计算长度是多少 append :        在值后面追加   多指令操作和单指令操作场景 区别:设置或者得到都其实是一条指令,首先需要把指令发送到redis,redis计算,redis返回,总共消

  • HashTable源码阅读

    环境jdk1.8.0_121 与HashMap有几点区别(不了解HashMap的具体实现,看我另个博客http://www.cnblogs.com/dj3839/p/8111675.html) 在HashMap中,冲突的值会在bucket形成链表,当达到8个,会形成红黑树,而在HashTable中,冲突的值就以链表的形式存储 publicsynchronizedVput(Kkey,Vvalue){ //Makesurethevalueisnotnull if(value==null){ thrownewNullPointerException(); } //Makessurethekeyisnotalreadyinthehashtable. Entry<?,?>tab[]=table; inthash=key.hashCode(); intindex=(hash&0x7FFFFFFF)%tab.length; @SuppressWarnings("unchecked") Entry<K,V>entry=(Entry<K,V>)tab[in

  • jq

    【1.jq简介】jQuery出生于2006年是一个美国人约翰写的,它出生的目的是简化js书写,jq的广告语:写的少,做的做。它和js是父子关系;【2.什么是DOM】dom其实就是我们的document;【3.为什么要学习jq】因为jq书写简单,容易理解,兼容性好(解决了几乎所有的兼容性问题)。【4.jq的书写步骤】1.加载jq文件2.换一行再写script标签3.写jq版的window.onload: $(function(){这里是代码})4.利用“金钱”收买元素:$('想要获取的元素')5.jq的事件不用加on,直接写匿名函数即可:click(function(){代码})【5.关于入口函数】window.onload只能写一个,如果写了多个,只会执行最后一个$(function(){}) 可以写多个并且都会执行【6.关于对象】DOM对象:   利用document获取的是DOM对象  安卓手机:安卓系统、双卡双待、换电池jQuery对象:利用$('')获取的是jQuery对象 苹果手机:ios系统、单

  • RS232、RS485和TTL电平与串行通信

    RS232、RS485和TTL 作为一个底层软件开发工程师,经常会碰到RS232、RS485和TTL这一类的问题。 之前总是碰到问题之后Google一下,把当下的问题解决了之后就不管了,过个一两天就忘得一干二净,结果后续每次都会碰到类似的问题,都是从零开始地去解决,这种方式看起来当时快速解决了问题,结果在后续的开发中浪费了更多的时间。 为了解决这个问题,博主决定一次性把这些东西给弄清楚 串行通信 串行通信是指使用一条数据线,将数据一位一位地依次传输,每一位数据占据一个固定的时间长度。 其只需要少数几条线就可以在系统间交换信息,特别适用于计算机与计算机、计算机与外设之间的短距离通信。 串行通信在传输方式上分为同步通信和异步通信,在传输方向上分为单工通信,半双工通信,全双工通信。 同步通信 顾名思义,同步通信需要通信双方进行数据同步,一般表现为通信双方在时钟线上的统一,双方在在数据的收发上是同时的,根据时钟线的跳变来操作数据线实现发送(读取),常用的同步协议有SPII2C。 异步通信 异步通信不需要建立数据同步即可传输数据,发送方按照一定的协议格式来发送数据,接收方接收到数据再根据协议进行

  • 《极客时间--算法面试》--剪枝

    剪枝:   主要用在搜索中的一个策略。 以下是两种搜索方法:广度搜索和深度搜索  

  • 本博客不使用,使用简书http://www.jianshu.com/u/e0c3321672f5

    自己五年多前就注册了博客园。不忘初心,加油吧!本博客不使用,使用简书,地址该账号已被查封。

  • pyhhon2.7+scrapy+mongodb-- 爬取豆瓣电影TOP250

    配置items.py文件 8importscrapy 9 10 11classDoubandyItem(scrapy.Item): 12#definethefieldsforyouritemherelike: 13#name=scrapy.Field() 14title=scrapy.Field() 15bd=scrapy.Field()复制 16star=scrapy.Field() 17quote=scrapy.Field()复制   配置setting.py文件 USER_AGENT='Mozilla/5.0(Macintosh;IntelMacOSX10_7_0)AppleWebKit/535.11(KHTML,likeGecko)Chrome/17.0.963.56Safari/535.11' ROBOTSTXT_OBEY=False COOKIES_ENABLED=False ITEM_PIPELINES={ 'doubandy.pipelines.DoubandyPipeline':300, }复制   配置srapy.py文件

  • R generate a table in Viewer Panel

    Theknitrisanveryusefultooltooutputareportfile. Generally,Iuseknitr::kable(cars,format="html")tooutputahtmlfile.Inmosttime,itisnotsoconvenient.Iusehttps://htmledit.squarefree.com/tohelpmetohandleit. TodayIfindkableExtraisapowerfultooltocomplement. kableExtra::scroll_box() kableExtra::kable_styling() kableExtra::kable_paper() kableExtra::kable_classic() Theoutputsisbelow. knitr::kable(mtcars)%>%kableExtra::kable_paper() 复制 站在巨人的肩膀,去学习

  • 正则化项L1和L2的区别

    https://blog.csdn.net/jinping_shi/article/details/52433975 https://blog.csdn.net/zouxy09/article/details/24971995 一、概括: L1和L2是正则化项,又叫做罚项,是为了限制模型的参数,防止模型过拟合而加在损失函数后面的一项。 二、区别:   1.L1是模型各个参数的绝对值之和。    L2是模型各个参数的平方和的开方值。   2.L1会趋向于产生少量的特征,而其他的特征都是0.    因为最优的参数值很大概率出现在坐标轴上,这样就会导致某一维的权重为0,产生稀疏权重矩阵     L2会选择更多的特征,这些特征都会接近于0。       最优的参数值很小概率出现在坐标轴上,因此每一维的参数都不会是0。当最小化||w||时,就会使每一项趋近于0 三、再讨论几个问题 1.为什么参数越小代表模型越简单?   越是复杂的模型,越是尝试对所有样本进行拟合,包括异常点。这就会造成在较小的区间中产生较大的波动,这

  • 防止UI穿透操作到游戏场景

    #ifUNITY_EDITOR||UNITY_STANDALONE_WINif(EventSystem.current.IsPointerOverGameObject()){return;}#elseif((Input.touchCount>0&&Input.GetTouch(0).phase==TouchPhase.Began)){if(EventSystem.current.IsPointerOverGameObject(Input.GetTouch(0).fingerId)){return;}}#endif

  • future

    Future 感觉最近学的有些心急,,有些时间没有用在刀刃上,所以有些可以咕咕咕的就先咕一下吧。 时间安排 上午 7:50-8:30-给学弟们讲课 8:35-9:10-数学预习 9:30-10:10-数学刷题 10:15-10:50-物理复习 10:50-11:30-物理刷题 11:30-11:50-自由学习(now:渗透测试) 12:05-10-12:30-自由学习(now:渗透测试) 下午 1:55-2:40-化学复习 2:45-3:30-化学刷题 3:50-4:30-物理习题 4:35-5:00-化学习题 5:00-6:10-算法(now:高等数学) 晚上 6:30-6:50:自由学习(now:渗透测试) 7:00-8:30-vp一场cf!important 8:50-9:30-英语 9:30-9:50-整理一下日常(同步学习笔记+日记) 9:50-放学-念诗! 学习计划 必须给自己限定一下学习进度了,不然有时候效率真的提不上去。从今天4.14一直到五一假期结束之前都先这样安排。之后可能把文化课和OI学习的时间reverse一下。 Rule 学习的时候不能开电脑!

相关推荐

推荐阅读