深度学习入门笔记(十八):卷积神经网络(一)_卷积神经网络相同填充-程序员宅基地

技术标签: 三维卷积  卷积神经网络  # 深度学习入门笔记️  padding填充  深度学习  卷积步长  

欢迎关注WX公众号:【程序员管小亮】

专栏——深度学习入门笔记

声明

1)该文章整理自网上的大牛和机器学习专家无私奉献的资料,具体引用的资料请看参考文献。
2)本文仅供学术交流,非商用。所以每一部分具体的参考资料并没有详细对应。如果某部分不小心侵犯了大家的利益,还望海涵,并联系博主删除。
3)博主才疏学浅,文中如有不当之处,请各位指出,共同进步,谢谢。
4)此属于第一版本,若有错误,还需继续修正与增删。还望大家多多指点。大家都共享一点点,一起为祖国科研的推进添砖加瓦。

深度学习入门笔记(十八):卷积神经网络(一)

推荐博客:大话卷积神经网络CNN(干货满满)

1、Padding填充

为了构建深度神经网络,需要学习很多东西,除了前面讲过的最基本的卷积,还需要学会使用的一个基本的卷积操作就是 padding,一起来看看它是如何工作的。

我们在 深度学习入门笔记(十六):计算机视觉之边缘检测 中讲过卷积这个例子,如果用一个3×3的过滤器卷积一个6×6的图像,那么最后会得到一个4×4的输出(也就是一个4×4矩阵)。这背后的数学解释是,如果有一个 n × n n×n n×n 的图像,用 f × f f×f f×f 的过滤器做卷积,步长是1,那么输出的维度就是 ( n − f + 1 ) × ( n − f + 1 ) (n-f+1)×(n-f+1) (nf+1)×(nf+1),即 6 − 3 + 1 = 4 6-3+1=4 63+1=4

这样的话会有两个缺点:

  • 第一个缺点是,每次卷积,图像就会缩小,从6×6缩小到4×4,再多做几次之后,比如当一个100层的深层网络,每经过一层图像都缩小,经过100层网络后,就会得到一个很小很小的图像,可能是1×1,可能是别的,但我们不想让图像在每次识别边缘或其他特征时都缩小。
  • 第二个缺点是,如果是在角落边缘的像素,这个绿色阴影标记只被一个输出所触碰或者使用,因为它位于这个3×3的区域的一角;但如果是在中间的像素点,比如红色方框标记,就会有许多个3×3的区域与之重叠,所以那些在角落或者边缘区域的像素点在输出中采用较少,意味着丢失了图像边缘位置的许多信息。

在这里插入图片描述
为了解决问题,在卷积操作之前可以填充这幅图像。

比如在这个案例中,可以沿着图像边缘再填充一层像素,这样6×6的图像就被填充成了8×8。如果用3×3的图像对这个8×8的图像卷积,得到的输出就不是4×4而是6×6,这样就得到了一个尺寸和原始图像相同的图像。

习惯上是用0去填充!如果 p p p 是填充的数量,在这个案例中 p = 1 p=1 p=1,因为在原始图像周围填充了一个像素点,输出也就变成了 ( n + 2 p − f + 1 ) × ( n + 2 p − f + 1 ) (n+2p-f+1)×(n+2p-f+1) (n+2pf+1)×(n+2pf+1),所以就变成了 ( 6 + 2 × 1 − 3 + 1 ) × ( 6 + 2 × 1 − 3 + 1 ) (6+2×1-3+1)×(6+2×1-3+1) (6+2×13+1)×(6+2×13+1),即 6 × 6 6×6 6×6,和输入的图像一样大。这样的话,涂绿的像素点(左边矩阵)影响了输出中的这些格子(右边矩阵)。这样一来,丢失信息或者更准确来说角落或图像边缘的信息发挥的作用较小的这一缺点就被削弱了。

填充像素通常有两个选择,分别叫做 Valid 卷积和 Same 卷积:

  • Valid 卷积意味着不填充,这样的话, p = 0 p=0 p=0
  • Same 卷积意味着填充,且输出大小和输入大小是一样的。

习惯上,计算机视觉中滤波器大小 f f f 是奇数,甚至可能都是这样,比如1,3,5,为什么很少能看到偶数的过滤器,大概有两个原因:

  • 第二个原因是,如果 f f f 是一个偶数,那么只能使用一些不对称填充,而只有 f f f 是奇数的情况下,Same 卷积才会有自然的填充,而不是左边填充多一点,右边填充少一点,这样不对称的填充。
  • 第二个原因是,当有一个奇数维过滤器,比如3×3或者5×5的,它就有一个中心点。有时在计算机视觉里,如果有一个中心像素点会更方便,便于指出过滤器的位置。

看起来,也许这些都不是为什么 f f f 通常是奇数的充分原因,但如果看了卷积的文献,你就会经常会看到3×3的过滤器,也可能会看到一些5×5,7×7的过滤器,甚至有些时候会是1×1的,后面会谈到它以及什么时候它是有意义的。

2、卷积步长

卷积中的步幅是另一个构建卷积神经网络的基本操作,来看一个例子。
在这里插入图片描述
如果也想用3×3的过滤器卷积这个7×7的图像,和之前不同的是,现在步幅设置成了2。第一个位置还是和之前一样取左上方的3×3区域的元素的乘积,再加起来,最后结果为91,然后向右移动两个空格,以此类推。

所以这个例子中是用3×3的矩阵卷积一个7×7的矩阵,得到一个3×3的输出,计算公式还是和之前一样,过程如下:

如果用一个 f × f f×f f×f 的过滤器卷积一个 n × n n×n n×n 的图像,padding p p p,步幅为 s s s,在这个例子中 s = 2 s=2 s=2,那么输出变为 ( n + 2 p − f s + 1 ) × ( n + 2 p − f s + 1 ) (\frac{n+2p - f}{s} + 1) \times (\frac{n+2p - f}{s} + 1) (sn+2pf+1)×(sn+2pf+1),其实之前的例子也是一样,只不过 s = 1 s=1 s=1,而在现在这个例子里 n = 7 n=7 n=7 p = 0 p=0 p=0 f = 3 f=3 f=3 s = 2 s=2 s=2   7 + 0 − 3 2 + 1 = 3 \ \frac{7 + 0 - 3}{2} + 1 =3  27+03+1=3,即3×3的输出。
在这里插入图片描述
现在只剩下最后的一个细节了,如果商不是一个整数怎么办?在这种情况下是会向下取整的, ⌊ ⌋ ⌊ ⌋ 就是向下取整的符号,也叫做对 z z z 进行地板除(floor),这意味着 z z z 向下取整到最近的整数。这个原则具体实现的方式是,只在蓝框完全包括在图像或填充完的图像内部时,才对它进行运算;如果有任意一个蓝框移动到了外面,那就不要进行相乘操作,这是一个惯例。

3、三维卷积

卷积不仅仅可以发生在二维图像上,也可以发生在三维立体上。

来看一个例子,假如说不仅想检测灰度图像的特征,也想检测 RGB 彩色图像的特征。如果彩色图像是6×6×3,这里的3指的是三个颜色通道,可以想象成3个6×6图像的堆叠,为了检测图像的边缘或者其他的特征,不是把它跟原来的3×3的过滤器做卷积,而是跟一个三维的3×3×3的过滤器卷积,这样这个过滤器也有三层,对应红绿、蓝三个通道。

给这些起个名字(原图像),这里的第一个6代表图像高度,第二个6代表宽度,这个3代表通道的数目。同样地,过滤器也有一个高,宽和通道数,并且图像的通道数必须和过滤器的通道数匹配,所以这两个数(紫色方框标记的两个数,3)必须相等。
在这里插入图片描述
还是卷积的过程,最后一个数字通道数必须和过滤器中的通道数相匹配。
在这里插入图片描述
把过滤器先放到最左上角的位置,这个3×3×3的过滤器有27个数,27个参数就是3的立方,依次取这27个数,然后乘以相应的红绿蓝通道中的数字:

  • 先取红色通道的前9个数字,
  • 然后是绿色通道,
  • 然后再是蓝色通道,
  • 乘以左边黄色立方体覆盖的对应的27个数,
  • 然后把这些数都加起来,就得到了输出的第一个数字。

如果要计算下一个输出,就把这个立方体滑动一个单位,执行上面的操作,以此类推。
在这里插入图片描述
那么,这个能干什么呢?

举个例子,这个过滤器是3×3×3的,如果想检测图像红色通道的边缘,那么可以将第一个过滤器设为 [ 1 0 − 1 1 0 − 1 1 0 − 1 ] \begin{bmatrix}1 & 0 & - 1 \\ 1 & 0 & - 1 \\ 1 & 0 & - 1 \\\end{bmatrix} 111000111,和之前一样,而绿色通道全为0( [ 0 0 0 0 0 0 0 0 0 ] \begin{bmatrix} 0& 0 & 0 \\ 0 &0 & 0 \\ 0 & 0 & 0 \\\end{bmatrix} 000000000),蓝色也全为0。这样的三个矩阵堆叠在一起形成一个3×3×3的过滤器就是一个检测垂直边界的过滤器,且只对红色通道有用。
在这里插入图片描述
或者如果你不关心垂直边界在哪个颜色通道里,那么可以用一个这样的过滤器, [ 1 0 − 1 1 0 − 1 1 0 − 1 ] \begin{bmatrix}1 & 0 & - 1 \\ 1 & 0 & - 1 \\ 1 & 0 & - 1 \\ \end{bmatrix} 111000111 [ 1 0 − 1 1 0 − 1 1 0 − 1 ] \begin{bmatrix}1 & 0 & - 1 \\ 1 & 0 & - 1 \\ 1 & 0 & - 1 \\ \end{bmatrix} 111000111 [ 1 0 − 1 1 0 − 1 1 0 − 1 ] \begin{bmatrix}1 & 0 & - 1 \\ 1 & 0 & - 1 \\ 1 & 0 & - 1 \\\end{bmatrix} 111000111,三个通道都是这样的。按照计算机视觉的惯例,过滤器可以有不同的高,不同的宽,但是必须一样的通道数。

现在我们已经了解了如何对立方体卷积,还有最后一个概念就是,如果不仅仅想要检测垂直边缘怎么办?如果同时检测垂直边缘和水平边缘,还有45°倾斜的边缘,还有70°倾斜的边缘怎么做?换句话说,如果想同时用多个过滤器怎么办?

一个6×6×3的图像和这个3×3×3的过滤器卷积,得到4×4的输出:

  • 第一个过滤器可能是一个垂直边界检测器或者是学习检测其他的特征;
  • 第二个过滤器可以是一个水平边缘检测器。

在这里插入图片描述
所以和第一个过滤器卷积,可以得到第一个4×4的输出,然后卷积第二个过滤器,得到另一个不同的4×4的输出,待做完卷积之后把这两个4×4的输出,把两个输出堆叠在一起得到了一个4×4×2的输出立方体。

小结一下 维度问题,如果有一个 n × n × n c n \times n \times n_{c} n×n×nc 的输入图像,在上面是6×6×3, n c n_{c} nc 是通道(或者深度)数目,然后卷积上一个 f × f × n c f×f×n_{c} f×f×nc,在上面是3×3×3,按照惯例,这个(前一个 n c n_{c} nc)和这个(后一个 n c n_{c} nc)必须数值相同,然后就得到了 ( n − f + 1 ) × ( n − f + 1 ) × n c ′ (n-f+1)×(n-f+1)×n_{c^{'}} nf+1×nf+1×nc,这里 n c ′ n_{c^{'}} nc 其实就是下一层的通道数,就是用的过滤器的个数,在上面就是4×4×2。这对立方体卷积的概念真的很有用!用它的一小部分直接在三个通道的 RGB 图像上进行操作,更重要的是,可以检测两个特征,比如垂直和水平边缘或者10个或者128个或者几百个不同的特征,并且输出的通道数会等于准备要检测的特征数。

4、单层卷积网络

做了这么多准备之后,终于可以开始构建卷积神经网络的卷积层,下面来看个例子。

通过两个过滤器卷积处理一个三维图像,并输出两个不同的矩阵:
在这里插入图片描述
最终各自形成一个卷积神经网络层,然后增加偏差(实数),通过 Python 的广播机制给这16个元素都加上同一偏差,然后应用非线性激活函数 ReLU,输出结果是一个4×4矩阵。对于第二个4×4矩阵,是加上了不同的偏差(实数),然后应用非线性函数,最终得到另一个4×4矩阵。然后重复之前的步骤,把这两个矩阵堆叠起来,得到一个4×4×2的矩阵。

广播机制看这里:深度学习入门笔记(五):神经网络的编程基础

通过计算,从6×6×3的输入推导出一个4×4×2矩阵,它是卷积神经网络的一层,把它映射到标准神经网络中四个卷积层中的某一层或者一个非卷积神经网络中。

注意,前向传播中一个操作就是 z [ 1 ] = W [ 1 ] a [ 0 ] + b [ 1 ] z^{[1]} = W^{[1]}a^{[0]} + b^{[1]} z[1]=W[1]a[0]+b[1],其中 a [ 0 ] = x a^{[0]} =x a[0]=x,执行非线性函数得到 a [ 1 ] a^{[1]} a[1],即 a [ 1 ] = g ( z [ 1 ] ) a^{[1]} = g(z^{[1]}) a[1]=g(z[1]),输入是 a [ 0 ] a^{\left\lbrack 0\right\rbrack} a[0],也就是 x x x,过滤器用变量 W [ 1 ] W^{[1]} W[1] 表示。在整个卷积过程中,对这3×3×3=27个数进行操作,其实是27×2(因为用了两个过滤器),取这些数做乘法,实际执行了一个线性函数,得到一个4×4的矩阵,卷积操作的输出结果是一个4×4的矩阵,它的作用类似于 W [ 1 ] a [ 0 ] W^{[1]}a^{[0]} W[1]a[0],也就是这两个4×4矩阵的输出结果,然后加上偏差。
在这里插入图片描述
这一部分(图中蓝色边框标记的部分)就是应用激活函数 ReLU 之前的值,它的作用类似于 z [ 1 ] z^{[1]} z[1],最后应用非线性函数,得到的这个4×4×2矩阵,成为神经网络的下一层,也就是激活层,这就是 a [ 0 ] a^{[0]} a[0] a [ 1 ] a^{[1]} a[1] 的演变过程。

示例中有两个过滤器,也就是有两个特征,因此最终才得到一个4×4×2的输出,但如果用了10个过滤器,而不是2个,最后会得到一个4×4×10维度的输出图像,因为我们选取了其中10个特征映射(而不仅仅是2个)将它们堆叠在一起,形成一个4×4×10的输出图像,也就是 a [ 1 ] a^{\left\lbrack1 \right\rbrack} a[1]

为了加深理解,来做一个练习。

假设现在有10个过滤器,而不是2个,神经网络的一层是3×3×3,那么,这一层有多少个参数呢???

来一起计算一下,每一层都是一个3×3×3的矩阵,因此每个过滤器有27个参数,也就是27个数,然后加上一个偏差,用参数 b b b 表示,现在参数增加到28个,有10个过滤器,即28×10,也就是280个参数。不过,请注意一点,不论输入图片有多大,1000×1000也好,5000×5000也好,参数始终都是280个,即使这些图片很大,参数却很少,这就是卷积神经网络的一个特征,叫作 避免过拟合

避免过拟合的方式看这里:深度学习入门笔记(十):正则化

5、总结

最后总结一下用于描述卷积神经网络中的一层(以 l l l 层为例),也就是卷积层的各种标记:

这一层是卷积层,用 f [ l ] f^{[l]} f[l] 表示过滤器大小,上标 [ l ] \lbrack l\rbrack [l] 用来标记 l l l 层,上标 [ l ] \lbrack l\rbrack [l] 表示 l l l 层中过滤器大小为 f × f f×f f×f;用 p [ l ] p^{[l]} p[l] 来标记 padding 的数量,valid 卷积,即无 paddingsame 卷积,即选定 padding;用 s [ l ] s^{[l]} s[l] 标记步幅。

这一层的输入会是某个维度的数据,表示为 n × n × n c n \times n \times n_{c} n×n×nc n c n_{c} nc 表示某层上的颜色通道数。只要稍作修改,增加上标 [ l − 1 ] \lbrack l -1\rbrack [l1],即 n [ l − 1 ] × n [ l − 1 ] × n c [ l − 1 ] n^{\left\lbrack l - 1 \right\rbrack} \times n^{\left\lbrack l -1 \right\rbrack} \times n_{c}^{\left\lbrack l - 1\right\rbrack} n[l1]×n[l1]×nc[l1],就变成了上一层的激活值。

使用图片的高度和宽度可以都一样,但也有可能不同,所以分别用上下标 H H H W W W 来标记,即 n H [ l − 1 ] × n W [ l − 1 ] × n c [ l − 1 ] n_{H}^{\left\lbrack l - 1 \right\rbrack} \times n_{W}^{\left\lbrack l - 1 \right\rbrack} \times n_{c}^{\left\lbrack l - 1\right\rbrack} nH[l1]×nW[l1]×nc[l1] l l l 层的输入就是上一层的输出,因此上标是 [ l − 1 ] \lbrack l - 1\rbrack [l1],这一层中会有输出(图像),其大小为 n H [ l ] × n W [ l ] × n c [ l ] n_{H}^{[l]} \times n_{W}^{[l]} \times n_{c}^{[l]} nH[l]×nW[l]×nc[l]。计算方式前面提到过,至少给出了高度和宽度, ⌊ n + 2 p − f s + 1 ⌋ \lfloor\frac{n+2p - f}{s} + 1\rfloor sn+2pf+1(注意: n + 2 p − f s + 1 \frac{n + 2p - f}{s} +1 sn+2pf+1 直接用这个运算结果,也可以向下取整)。

那么通道数量又是什么?这些数字从哪儿来的?

输出图像也具有深度,等于该层中过滤器的数量,就是输入通道数量,所以过滤器维度等于 f [ l ] × f [ l ] × n c [ l − 1 ] f^{[l]} \times f^{[l]} \times n_{c}^{\left\lbrack l - 1 \right\rbrack} f[l]×f[l]×nc[l1]。应用偏差和非线性函数之后,这一层的输出等于它的激活值 a [ l ] a^{[l]} a[l](三维体),即 n H [ l ] × n W [ l ] × n c [ l ] n_{H}^{[l]} \times n_{W}^{[l]} \times n_{c}^{[l]} nH[l]×nW[l]×nc[l]。当执行批量梯度下降或小批量梯度下降时,如果有 m m m 个例子,就是有 m m m 个激活值的集合,那么输出 A [ l ] = m × n H [ l ] × n W [ l ] × n c [ l ] A^{[l]} = m \times n_{H}^{[l]} \times n_{W}^{[l]} \times n_{c}^{[l]} A[l]=m×nH[l]×nW[l]×nc[l]

该如何确定权重参数,即参数W呢?

过滤器的维度已知,为 f [ l ] × f [ l ] × n c [ l − 1 ] f^{[l]} \times f^{[l]} \times n_{c}^{[l - 1]} f[l]×f[l]×nc[l1],这只是一个过滤器的维度,如果是多个, n c [ l ] n_{c}^{[l]} nc[l] 是过滤器的数量,权重也就是所有过滤器的集合再乘以过滤器的总数量,即 f [ l ] × f [ l ] × n c [ l − 1 ] × n c [ l ] f^{[l]} \times f^{[l]} \times n_{c}^{[l - 1]} \times n_{c}^{[l]} f[l]×f[l]×nc[l1]×nc[l]

最后看看偏差参数,每个过滤器都有一个偏差参数(实数),它是某维度上的一个向量,为了方便,在代码中常常表示为一个1×1×1× n c [ l ] n_{c}^{[l]} nc[l] 的四维向量或四维张量。

推荐阅读

参考文章

  • 吴恩达——《神经网络和深度学习》视频课程
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/TeFuirnever/article/details/104174480

智能推荐

el-date-picker 时间控件 重新选择时间没有更新值_el-date-picker刷新选择时间-程序员宅基地

文章浏览阅读1k次。最近项目中遇到选择时间控件不能重新赋值得问题,最后解决办法就是加上一个时间清空。这样子就解决了重新选择没有更新值问题。_el-date-picker刷新选择时间

线性回归预测PM2.5值_根据上述内容,在右侧编辑器补充线性回归代码,预测18天的 pm25 值-程序员宅基地

文章浏览阅读2.6k次,点赞4次,收藏23次。文章目录一、问题描述二、设计简要描述三、程序清单四、结果分析五、调试报告:六、实验总结一、问题描述希望用线性回归解决问题:给定某个地区连续9小时包括PM2.5在内的18项污染物每小时的数据,预测第10个小时的PM2.5的值。二、设计简要描述机器学习的三个基本步骤——程序设计思路——三、程序清单import pandas as pdimport numpy as np# 1 训练集处理# 1.1 读取训练集数据,big5是针对于文档中存在繁体字的编码train_data = pd_根据上述内容,在右侧编辑器补充线性回归代码,预测18天的 pm25 值

Spring AOP的—绍和5种通知类型的使用(详解)_3、说下对springaop的理解、有哪些通知?使用场景有哪些?(底层原理:两种动态代理)-程序员宅基地

文章浏览阅读2.6k次,点赞3次,收藏9次。java Spring AOP介绍与使用1、Aop的概念AOP的核心概念及术语切面(Aspect): 指关注点模块化,这个关注点可能会横切多个对象。事务管理是企业级Java应用中有关横切关注点的例子。 在Spring AOP中,切面可以使用通用类基于模式的方式(schema-based approach)或者在普通类中以@Aspect注解(@AspectJ 注解方式)来实现。连接点(Join point): 在程序执行过程中某个特定的点,例如某个方法调用的时间点或者处理异常的时间点。在Spring_3、说下对springaop的理解、有哪些通知?使用场景有哪些?(底层原理:两种动态代理)

单页面导航插件jquery.singlePageNav.min.js_单页导航 头插件-程序员宅基地

文章浏览阅读2.1k次。singlePageNav.min.js单页面导航插件用于优化导航效果,使锚点链接不在很生硬,达到平滑过渡的效果,优化用户体验下载地址singlePageNav.min.js1.使用方法引入jquery和singPageNav.min.js<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/jquery.min..._单页导航 头插件

Spring如何用“声明式事务”保护亿万数据安全?【万字解决并发冲突】_声明式安全-程序员宅基地

文章浏览阅读887次,点赞59次,收藏26次。Hello,你好呀,我是灰小猿,一个超会写bug的程序猿????!用坚持缔造技术、用指尖敲动未来!愿我们每一次敲动键盘,都能让生活变得更智能、世界变得更有趣!点外卖时,你只需考虑如何拼单;选择出行时,你只用想好目的地;手机支付时,你只需要保证余额充足。但你不知道这些智能的背后,是数以亿计的强大数据的支持,这就是数据库的力量。那么庞大数据的背后一定会牵扯到数据安全的问题,那这些意外和冲突又是如何解决的呢?今天我们来一探究竟????!今天这篇文章,我就来和大家讲一下在Spring框架的声明式事务中_声明式安全

hibernate连接多个数据库_winform hibernate-configuration 项目加载多个数据库-程序员宅基地

文章浏览阅读5.1k次。本文转自自http://blog.sina.com.cn/s/blog_49bf8585010004m6.html一、 Hibernate访问数据库时加载的过程对于大多数使用Hibernate的朋友来说,通常使用一下方式来获得Configuration实例: Configuration configure = new Configuration()._winform hibernate-configuration 项目加载多个数据库

随便推点

QCM2290 PM-3 fastboot不识别USB_pm4125-程序员宅基地

文章浏览阅读2.3k次。项目场景:在QCM2290 有两种型号的pm4125,这两种型号硬件上完全pin-to-pin,可以互换的。pm-2 仅支持mirco-usb。pm-3 支持typec-usb,通过软件兼容可以做到支持mirco-usb。问题描述:由于公司规划,后续项目都是使用pm-3,因此有客户提出pm-3的模块在fastboot 下无法识别mirco-usb。 原因分析:1.通过对比pm-2 mirco usb okpm-3 mirco usb failpm-3 typec u_pm4125

JavaSE之多线程_javase之多线程vip插队-程序员宅基地

文章浏览阅读142次。目录1.线程简介2.线程创建2.1 三种创建方式:2.2 继承Thread2.3 实现Runnable接口2.4 实现Callable接口1.线程简介1.多任务多任务处理是指用户可以在同一时间内运行多个应用程序,每个应用程序被称作一个任务.Linux、windows就是支持多任务的操作系统2.多线程多线程(multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。3.并发和并行并发:一段时间内多条线程同时进行(逻辑上是同时的)。并行:同一时刻有多条线程进行(物理上的,如_javase之多线程vip插队

Hystrix(防止服务雪崩)--服务降级_hystrix防止服务降级的方法-程序员宅基地

文章浏览阅读141次。服务降级当某一时间,服务器压力激增的情况下,下游服务主动停掉一些不太重要的业务,释放服务资源,增加响应速度当下游服务由于某种原因不可用,上游主动调用本地的一些降级逻辑,避免卡顿,迅速返回给用户简单来说就是,假如某一时间段A服务器访问的人数激增,B一般,C几乎没人访问,那么就先停掉C服务,把资源让给A:服务降级的实现:首先我们有一个服务:@Component@FeignClient(value = "SERVICE-OBJECT-A")public interface ServiceAF_hystrix防止服务降级的方法

云计算 ——虚拟化认识_虚拟化在计算机科学中意味着什么?虚拟化如何推动云计算?-程序员宅基地

文章浏览阅读1.2k次。云计算 ——虚拟化认识虚拟化概述 :计算机虚拟化是一个对整个信息产业有突破性的信息技术 ,是云计算的核心技术虚拟化在云计算上面的意义 :每一个应用部署的环境和物理平台是没有关系的,通过虚拟平台进行管理,扩展,迁移,备份 种种操作都通过虚拟化层次完成服务器虚拟化 :采用服务器虚拟化可以减少服务器的数量,简化服务器管理,同时提高服务器效率,网络灵活性和可靠性桌面虚拟化 :是将桌面的软件进行虚拟化改造的技术应用虚拟化 :将关键应用计算从用户设备中分离出来,通过集中化技术改善了控制力和安全性 从而提高关_虚拟化在计算机科学中意味着什么?虚拟化如何推动云计算?

大众点评数据分析_大众点评全国美食数据分析-程序员宅基地

文章浏览阅读5.6k次,点赞6次,收藏45次。大众点评数据分析项目完整流程(一)项目背景在大学的时候,每天都要面对一个世纪难题所困扰,那就是:中午吃什么?晚上吃什么?于是乎突发奇想,就想要统计一下全国一二线城市美食店的总体水平,吃不到也要看看别人家的餐桌摆的都是什么,哪些精品餐厅我还不知道,酒香不怕巷子深,我要把你们统统挖出来。(二)项目介绍本项目主要是对大众点评中全国范围内一二线城市美食信息进行分析,暂时不考虑其它线的城市。整个项目..._大众点评全国美食数据分析

万字长文爆肝Python基础入门【第二弹、超详细数据类型总结】_>>> letters=['a','b', 'c', 'a'] >>> letters. remov-程序员宅基地

文章浏览阅读6.9k次,点赞129次,收藏490次。目录一、建立一个数据火车——列表1、创建列表2、列表元素的获取3、列表元素的添加4、列表元素的删除5、列表元素的修改二、列表的亲兄弟——元组1、创建元组2、元组元素的获取3、元组和列表的差别三、数据中的魔术师——字符串1、创建字符串2、字符的获取3、字符串的处理4、字符转义5、原始字符串6、多行字符串7、列表、元组、字符串的通用操作8、列表、元组、字符串总结四、索引存储不再麻烦——字典1、创建字典2、字典键值对的添加_>>> letters=['a','b', 'c', 'a'] >>> letters. remove('a') >>> print(letters)

推荐文章

热门文章

相关标签