【论文阅读总结】inception v2_v3总结

news2024/11/15 10:13:53

重新思考计算机视觉的Inception架构

    • 1.摘要
    • 2.简介
      • 2.1 以往模型问题
      • 2.2 问题缓解
      • 2.3 问题解决出现的问题
      • 2.4 有效的一般原则和优化思想
    • 3.一般设计原则
      • 3.1 设计原则1【避免代表性瓶颈(不能过度降维)】
      • 3.2 设计原则2【特征越多,收敛越快】
      • 3.3 设计原则3【卷积之前使用1*1卷积降维】
      • 3.4 设计原则4【平衡网络的宽度和深度】
    • 4.大滤波器尺寸的分解卷积
      • 4.1分解成更小的卷积
        • 4.1.1小滤波器问题
        • 4.1.3 问题解决【小滤波器代替大滤波器】
        • 4.1.4 替换问题思考
      • 4.2 空间因子分解成不对称卷积
        • 4.2.1分解 新思想
    • 5.辅助分类器的效用
    • 6.有效减小网格尺寸
      • 6.1池化操操作改进
    • 7.Inception_v2
    • 8.Inception v3
    • 9.通过标签平滑的模型正则化【大致理解】
      • 9.1 one-hot编码设置标签问题
      • 9.2 标签平滑正则化
    • 10.阅读总结

  • 论文链接:
    • https://arxiv.org/pdf/1512.00567.pdf
  • 视频链接:
    • 【子豪兄】精读人工智能经典论文 inception v3

1.摘要

  • 卷积网络是最先进的计算机视觉解决方案的核心,适用于各种各样的任务。非常深度的卷积网络开始成为主流,在各种基准测试【图像分类,物体检测等】中产生了巨大收益。
  • 增加模型大小和计算成本为大多数任务的质量立即提高(只要为训练提供足够的标记数据),但计算效率和低参数计数仍然是需要优化的因素。
  • 在这里,我们正在探索扩大网络的方法,目的是通过适当的卷积分解积极的正则化尽可能有效地利用增加的计算。

2.简介

  • 深度卷积架构中的架构改进可以用于提高大多数其他计算机视觉任务的性能,这些任务越来越依赖于高质量的学习视觉特征。此外,网络质量的改善为卷积网络带来了新的应用领域。

2.1 以往模型问题

  • VGGNet具有架构简单的引人注目的特点,但这需要很高的成本:评估网络需要大量的计算。
  • GoogLeNet的Inception架构也被设计成即使在内存和计算预算的严格限制下也能很好地执行。
    • 例如,GoogleNet只使用了500万个参数,与使用6000万个参数的前身AlexNet相比,减少了12倍。此外,VGGNet采用的参数比AlexNet多约3倍。
  • Inception的计算成本也远低于VGGNet或其更高性能的后继者。这使得在需要以合理的成本处理大量数据的大数据场景或内存或计算能力固有有限的场景(例如在移动视觉设置中)中利用Inception网络变得可行。

2.2 问题缓解

  • 通过对目标内存使用、应用专门的解决方案,或者通过计算技巧优化某些操作的执行,可以缓解部分问题。
  • 然而,这些方法增加了额外的复杂性。此外,这些方法也可以用于优化Inception架构,再次扩大效率差距。

2.3 问题解决出现的问题

  • 结构复杂性,不容易更改结构
    • Inception体系结构的复杂性使得对网络进行更改变得更加困难。如果简单地扩展架构,很大一部分计算收益可能会立即损失。此外,GoogLeNet并没有提供关于导致GoogLeNet架构的各种设计决策的促成因素的清晰描述。这使得它很难适应新的用例,同时保持其效率。
    • 例如,如果认为有必要增加某些inception风格模型的容量,那么将所有滤波器组大小的数量增加一倍的简单转换将导致计算成本和参数数量增加4倍。在许多实际情况下,这可能是不合理的,特别是如果相关的收益是适度的。

2.4 有效的一般原则和优化思想

  • 本文中,我们使用了对有效地扩展卷积网络有用的一般原则和优化思想,尽管我们的原则并不局限于Inception类型的网络,但是在这种情况下,它们更容易观察到,因为Inception风格构建块的一般结构足够灵活,可以自然地合并那些约束。
  • 这是通过大量使用Inception模块的降维和并行结构实现的,这允许减轻结构更改对附近组件的影响。尽管如此,这样做仍然需要谨慎,因为应该遵守一些指导原则来保持模型的高质量

3.一般设计原则

  • 设计原则
    • 原则的效用是推测性的,未来将需要更多的实验证据来评估其准确性和有效性领域。但是,对这些原则的严重偏离往往会导致网络质量的恶化,而当检测到这些偏离时,修复情况会导致总体上的架构改进。
    • 注意
      • 不遵守原则:效果一定不好;
      • 遵守原则:效果不一定提升但是效果不会太差。
  • 尽管这些原则可能是有意义的,但使用它们来提高网络的质量并不是一件简单的事情。我们的想法是只在模棱两可的情况下明智地使用它们。

3.1 设计原则1【避免代表性瓶颈(不能过度降维)】

  • 避免代表性瓶颈,特别是在网络的早期。
    • 就是在网络前期,进行卷积时,不要使用太大的卷积核,导致数据降维【压缩】严重,使数据没有原来的代表能力。
  • 前馈网络可以用从输入层到分类器或回归器的无环图表示。这为信息流定义了一个明确的方向。
  • 对于将输入与输出分开的任何切割,都可以访问通过该切割的信息量。应该避免极端压缩带来的瓶颈
  • 一般来说,在最终的输出层之前,表示式的大小应该从输入逐渐减小到输出。从理论上讲,信息内容不能仅通过表示的维数来评估,因为它抛弃了相关结构等重要因素;维度仅仅提供了信息内容的粗略估计。

3.2 设计原则2【特征越多,收敛越快】

  • 高维表示更容易在网络中本地处理。
  • 在卷积网络中增加增加非线性激活变换可以获得更多的解纠缠特征【同类更容易分开】。由此产生的网络将训练得更快。
    • 例如:增加非线性变换,使猫的特征更容易分在一起,狗的特征更容易分在一起。猫狗的特征相关性也不大。

3.3 设计原则3【卷积之前使用1*1卷积降维】

  • 空间聚合可以在较低维度的嵌入中完成,而不会在表示能力上有太多或任何损失。
    • 例如,在执行更分散的(例如3 × 3)卷积之前,可以在空间聚集之前降低输入表示的维数,而不会产生严重的不利影响。
  • 我们假设,其原因是相邻单元之间的强相关性导致在降维过程中的信息损失要少得多,如果输出用于空间聚合上下文。考虑到这些信号应该是容易压缩的,降维甚至可以促进更快的学习。

3.4 设计原则4【平衡网络的宽度和深度】

  • 深度:模型深度,层数
  • 宽度:卷积核数量,维度
  • 通过平衡每级滤波器的数量和网络深度,可以达到网络的最佳性能。
  • 同时增加网络的宽度和深度可以提高网络的质量。
  • 如果两者并行增加,则可以达到恒定计算量的最佳改进。
  • 因此,计算预算应该在网络的深度和宽度之间以平衡的方式分配。

4.大滤波器尺寸的分解卷积

  • GoogLeNet网络的大部分原始收益来自于大量使用降维。这可以看作是一种计算效率高的卷积因式分解的特殊情况。
    • 例如,一个1 × 1卷积层后面跟着一个3 × 3卷积层的情况。
  • 在视觉网络中,附近激活的输出是高度相关的。我们预期它们的激活可以在聚合之前减少,应该会导致局部相似特征更容易表达【卷积之前降维,激活就少了】
  • 我们探索了在各种设置下分解卷积的其他方法,特别是为了提高解决方案的计算效率。
  • 由于Inception网络是完全卷积的,每激活一次就算一次矩阵点积。任何计算成本的降低都会导致参数数量的减少。这意味着,通过适当的因式分解,我们可以得到更多解纠缠的参数,从而获得更快的训练。
  • 我们可以使用节省的计算量和内存来增加我们网络的过滤器库大小,同时保持我们在一台计算机上训练每个模型副本的能力。

4.1分解成更小的卷积

4.1.1小滤波器问题

  • 小滤波器尺寸表达能力不好
    • 具有更大空间滤波器(例如5 × 5或7 × 7)的卷积在计算方面往往是不成比例的昂贵。
      • 例如,设输入滤波器个数为m,输出特征图个数为n。5*5滤波器计算成本是3*3的 2.78倍。
        n u m b e r 5 = m ∗ 5 ∗ 5 ∗ n = 25 m n n u m b e r 3 = m ∗ 3 ∗ 3 ∗ n = 9 m n n u m b e r 5 n u m b e r 3 = 25 m n 9 m n = 2.78 \begin{aligned} number_5= m*5*5*n=25mn\\ number_3= m*3*3*n=9mn\\ \frac{number_5}{number_3}=\frac{25mn}{9mn}=2.78 \end{aligned} number5=m55n=25mnnumber3=m33n=9mnnumber3number5=9mn25mn=2.78
    • 5 × 5滤波器可以捕获早期层中较远的单元激活之间的信号之间的依赖关系,因此滤波器尺寸的减小对表达能力付出巨大代价。【相邻单元具有强相关性,大的卷积核可以更好的提取相关性信息】

4.1.3 问题解决【小滤波器代替大滤波器】

  • 使用多层小滤波器代替大滤波器
    • 我们放大5×5卷积的计算图,看到每个输出看起来像一个完全连接的小网络,在其输入上滑动5×5卷积核。
    • 我们构造一个视觉网络,似乎自然利用了平移不变性取代完全连接组件由两层回旋的体系结构:
      • 第一层3×3卷积,第二个完全连接层的3×3输出网格的第一层。
    • 发现:滑动这个小型网络输入激活网格可以归结为:两层3×3卷积替换一层5×5卷积得到,并且明显地减少了参数计数
      在这里插入图片描述
  • 结论:在相同的输入大小和输出深度下,可以用更少参数的多层网络来代替5*5卷积。【figure5代替figure4】
    • 例如:使用2层3*3的卷积核代替一层5*5卷积核,参数少了0.28%
      • 设输入特征图个数为C,输出特征图个数也为C
        n u m b e r 3 = 2 ∗ ( 3 ∗ 3 ∗ C ∗ C ) = 18 C 2 n u m b e r 5 = 5 ∗ 5 ∗ C ∗ C = 25 C 2 n u m b e r 3 n u m b e r 5 = 18 C 2 25 C 2 = 0.72 1 − 0.72 = 0.28 \begin{aligned} number_3&=2*(3*3*C*C) \\&=18C^2\\ number_5&=5*5*C*C \\&=25C^2\\ \frac{number_3}{number_5}&=\frac{18C^2}{25C^2}=0.72\\ 1-0.72&=0.28 \end{aligned} number3number5number5number310.72=233CC)=18C2=55CC=25C2=25C218C2=0.72=0.28
        在这里插入图片描述
        在这里插入图片描述

4.1.4 替换问题思考

  • 问题:
    • 这种替换是否会导致表达性的损失?
    • 如果我们的主要目标是分解计算的线性部分,使用2层3*3卷积代替一层5*5卷积,是否第一层不适用非线性激活,保持线性激活?
  • 实验结果:
    • 在分解的所有阶段,使用线性激活效果总是不如非线性激活。
    • 将这种增益归因于网络可以学习的增强的变化空间,特别是使用batch-normalize输出激活。
    • 当对1*1卷积使用线性激活时,可以看到类似的效果。
      在这里插入图片描述

4.2 空间因子分解成不对称卷积

  • 上述结果表明,滤波器大于3 × 3卷积并不常用,因为它们总是可以简化为3 × 3卷积序列【就是大卷积都可以用多层小卷积代替】

4.2.1分解 新思想

  • 是否应该把它们分解成更小的,例如2 × 2卷积。
  • 事实证明:通过使用不对称卷积(例如n × 1),可以得到比2 × 2更好的结果。
    • 例如,使用3 × 1卷积,然后使用1 × 3卷积,相当于滑动一个具有与3 × 3卷积中相同接收域的两层网络。
    • 如果输入和输出滤波器的数量相等,对于相同数量的输出滤波器,两层解决方案要便宜33%。相比之下,将一个3 × 3卷积分解为两个2 × 2卷积只节省11%的计算量
      在这里插入图片描述
  • 理论上,我们认为可以用1 × n的卷积来代替任何n × n的卷积。随着n的增长,节省的计算成本显著增加。
  • 因式分解在早期层上效果不佳,但在中等网格尺寸上(在m × m特征图上,12<m<20)有非常好的结果。在这个层面上,通过使用1 × 7卷积和7 × 1卷积可以获得非常好的结果。
    在这里插入图片描述

5.辅助分类器的效用

  • 最初使用辅助分类器动机:将有用的梯度推到较低的层,使它们立即有用,并通过解决非常深的网络中的梯度消失问题来提高训练期间的收敛性。Lee等认为辅助分类器促进更稳定的学习和更好的收敛。
  • 发现辅助分类器在训练早期并没有提高收敛性:
    • 在两个模型达到高精度之前,有侧头和没有侧头的网络的训练过程看起来几乎相同。
    • 在训练接近尾声时,有辅助分支的网络的准确率开始超过没有辅助分支的网络,并达到一个稍高的平台。
  • 在网络的不同阶段使用两个侧头。下辅助分支的移除对网络的最终质量没有任何不利影响。即这些分支有助于进化低级特征,很可能是错误的。
  • 我们认为辅助分类器充当正则器。如果侧分支是batch-normalize或dropout层,则网络的主分类器性能更好,这一事实支持了这一点。这也为 batch normalization作为正则器的猜想提供了一个微弱的支持证据。
    在这里插入图片描述

6.有效减小网格尺寸

6.1池化操操作改进

  • 传统的卷积网络使用池化操作来减小特征映射的网格大小(容易得到瓶颈)。为了避免表示瓶颈,在应用最大或平均池之前,网络过滤器的激活维度将被扩展。
  • 例如:通过k个过滤器 d ∗ d d*d dd网格,得到2k过滤器的 d 2 ∗ d 2 \frac{d}{2}*\frac{d}{2} 2d2d网格。
    • 方法一:使用stride-1【步长为1】,卷积核数为2k卷积,再池化。

      • 缺点: 整体参数为 2 d 2 k 2 2d^2k^2 2d2k2,参数量太大
    • 方法二:先池化,在卷积。

      • 缺点(违背原则1):会产生表征瓶颈,导致表达性较差的网络。 在这里插入图片描述
    • 方法三:

      • 使用另一种变体,在去除表征瓶颈的同时进一步降低计算成本。我们可以使用两个平行的stride 2块😛 and C。P是池化层(平均池化或最大池化)的激活,它们都是stride 2的过滤器组
        在这里插入图片描述

7.Inception_v2

  • Inception_v2:从上面的点连接起来,并提出了一个新的架构。注意,我们已经将传统的7 × 7卷积分解为3个3 × 3卷积。
  • 每个模块的输出大小是下一个模块的输入大小。用0填充标记卷积,用于保持网格大小。0填充也用于那些不减少网格大小的Inception模块中。所有其他层都不使用填充。选择不同的滤波器组大小以遵守原则4。
  • 只要遵守原则,网络的质量对于变化是相对稳定的。虽然我们的网络有42层,但我们的计算成本只比GoogLeNet高2.5左右,效率仍然比VGGNet高得多。
    在这里插入图片描述
  • inception块图
    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述

8.Inception v3

  • inception_v3在inception_v2基础上加上了辅助分类器
    在这里插入图片描述
  • 辅助分类器
    在这里插入图片描述

9.通过标签平滑的模型正则化【大致理解】

  • 我们提出了一种机制:通过估计训练过程中标签退出的边缘效应来正则化分类器层。
  • 最大似然估计求损失函数
    • 相关博文
      • 推导线性回归损失函数MSE
      • 分类与回归梯度下降公式推导

9.1 one-hot编码设置标签问题

  • 交叉熵损失函数公式
    L o s s = − ∑ k = 1 k l o g ( p ( k ) ) q ( k ) \begin{aligned} Loss &=-\sum_{k=1}^{k}log(p(k))q(k) \end{aligned} Loss=k=1klog(p(k))q(k)
  • 一个真实标签, q ( y ) = 1 , q ( k ) = 0 q(y)=1,q(k)=0 q(y)=1,q(k)=0,当 k ≠ y k\neq y k=y
  • 根据one-hot编码,当k = y时等于1,否则为0【正标签为1,副标签为0】。
  • 根据交叉熵损失函数,当k=y时,才有损失,其他的副标签都为0,因为q(k)=0。
  • 但是实际中这个并不合理,模型会为了最小化损失,把正确标签的概率值最大化(可能会正无穷),这并不是实际的损失,对模型学习效果不好。模型中有很多相似特征,不应该把相似的物体损失全部设为0
  • 导致2个问题
    • 它可能会导致过拟合:如果模型学会为每个训练示例将完全概率分配给正标签,则不能保证泛化。【为了损失小,将正标签设置很大】
    • 降低了模型的适应能力:它鼓励最大的logit和其他所有logit之间的差异变得很大,这与有界的梯度相结合,降低了模型的适应能力。直观地说,这是因为模型对自己的预测过于自信。【梯度下降太快】

9.2 标签平滑正则化

  • 我们提出了一种机制来鼓励模型变得不那么自信。虽然如果目标是最大化训练标签的对数可能性,这可能不是理想的,但它确实使模型正则化并使其更具适应性。
  • 设置平滑参数 ξ \xi ξ
  • 对于一个具有ground-truth标签y的训练示例,我们替换标签分布 q ( k ∣ x ) = δ k , y q(k|x) = \delta _{k,y} q(kx)=δk,y
    在这里插入图片描述
  • 它是原始真实分布q(k|x)和固定分布u(k)的混合,权重为 1 − ξ 1−\xi 1ξ ξ \xi ξ
  • 这可以看作是得到的标签k的分布如下:
    • 首先,将其设置为groundtruth标签k = y;然后,用概率 ξ \xi ξ将k替换为从分布u(k)中抽取的样本。我们建议使用标签上的先验分布u(k)。在我们的实验中,我们使用均匀分布 u ( k ) = 1 K u(k) = \frac{1}{K} u(k)=K1
    • 这种基本真相标签分布的变化称为标签平滑正则化(label-smoothing regularization, LSR)
      • LSR实现了防止最大的logit变得比所有其他logit大得多的预期目标。
        在这里插入图片描述
  • 事实上,如果这种情况发生,那么一个q(k)将趋于1,而所有其他q(k)将趋于0。这将导致与 q ′ ( k ) q^{'}(k) q(k)的交叉熵很大,因为与 q ( k ∣ x ) = δ k , y q(k|x) = \delta _{k,y} q(kx)=δk,y不同,所有 q ′ ( k ) q^{'}(k) q(k)都有一个正的下界
  • 因此,LSR等价于用一对这样的损失 H ( q , p ) H(q, p) H(q,p) H ( u , p ) H(u, p) H(u,p)来代替一个交叉熵损失 H ( q , p ) H(q, p) H(q,p)
  • 第二个损失惩罚了预测标签分布p与先验u的偏差,其相对权重为 u ( k ) = ξ 1 − ξ u(k) = \frac{\xi}{1-\xi} u(k)=1ξξ。这个偏差可以等效地用KL散度来捕捉,因为 H ( u , p ) = D K L ( u ∣ ∣ p ) + H ( u ) H(u, p) = D_{KL}(u||p) + H(u) H(u,p)=DKL(u∣∣p)+H(u),而H(u)是固定的。当u是均匀分布时,H(u, p)是对预测分布p与均匀分布的不同程度的度量,这也可以通过负熵−H§来测量(但不是等效的);我们还没有试验过这种方法。
    在这里插入图片描述
  • 结论:在我们的ImageNet实验中,K = 1000个类,我们使用u(K) = 1/1000和 ξ = 0.1 \xi=0.1 ξ=0.1。对于ILSVRC 2012,我们发现top-1误差和top-5误差的绝对改善均为0.2%左右。

10.阅读总结

  • 深度学习主要问题就是深度与宽度问题
  • 增加深度,会导致计算量增大,引入大滤波器尺寸的分解卷积
  • 思考可以使用更小的卷积或不对称卷积,引入空间因子分解成不对称卷积
  • 卷积后池化容易得到瓶颈,卷积前池化违背原则2,引入stride-2滤波器
  • 损失函数会侧重于正确标签,导致模型学习能力变差,引入标签平滑正则化
  • 将大滤波器尺寸的分解卷积,空间因子分解成不对称卷积,stride-2滤波器结合,得到inception_v2
  • 将inception_v2添加辅助分类器,得到inception_v3
  • 注意:模型设计需要遵守四大设计原则,上文3所述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/108237.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【java】opencv + Tesseract(tess4j) 实现图片处理验证码识别

1.opencv for java 环境搭建和测试 到OpenCV官网下载你需要的版本&#xff0c;运行安装&#xff0c;记住安装目录。打开上一步安装的位置&#xff0c;依次打开如下图位置&#xff0c;复制opencv-{version}.jar、x64包下对应的dll到项目里&#xff0c;放在同级 在maven里添加o…

JVS低代码首页功能介绍

首页介绍 首页操作演示 系统logo 系统logo是每个系统的名称标识&#xff0c;点击系统logo可以返回到首页&#xff0c;这里的系统logo是支持配置化的。 应用快捷导航 应用快捷导航是将登录用户有权限使用的应用展示出来&#xff0c;鼠标点击后&#xff0c;系统展示可见的应用于…

k8s-Pod的生命周期和调度

目录 主要运行周期 1 Pod创建和终止 2 初始化容器 3 钩子函数 4 容器探测 5 重启策略 Pod调度 1 定向调度 2 亲和性调度 3 污点和容忍 主要运行周期 我们一般将pod对象从创建至终的这段时间范围称为pod的生命周期&#xff0c;它主要包含下面的过程&#xff1a; pod创…

vscode python远程开发最佳实践

文章目录环境插件踩坑python类型提示不起作用配置PYTHONPATH前言 最近因为remote-ssh从pycharm转到vscode开发, 再删掉pycharm强制使用vscode摸索了一周熟练之后发现vscode其实使用起来也很爽&#xff0c;一些踩坑和最佳实践方案汇总 环境 插件 remote-sshpythonpylance(微软…

Compose 动画艺术探索之 Easing

本篇文章是此专栏的第六篇文章&#xff0c;前几篇文章大概将 Compose 中的动画都简单过了一遍&#xff0c;如果想阅读前几篇文章的话可以点击下方链接&#xff1a; Compose 动画艺术探索之瞅下 Compose 的动画Compose 动画艺术探索之可见性动画Compose 动画艺术探索之属性动画…

Mobtech 秒验应用介绍

一、传统APP手机注册登录验证的弊端 1、 注册过程输入的信息过多&#xff0c;耗费时间长。用户体验感较差。 2、 传统手机绑定需要通过验证码验证手机真实性&#xff0c;容易被批量注册。 3、 如果手机APP多&#xff0c;每个APP都注册&#xff0c;使用的用户名密码多&#x…

高薪资的IT行业,我们该不该转行

今年互联网各大厂秋招基本结束&#xff0c;校招薪资已经出炉了。可以从上图中看到&#xff0c;今年薪资仍然存在倒挂&#xff08;新员工工资高过老员工&#xff09;现象。各大厂人均 30w 的薪资在其它专业是难以想象的。大家无需置疑上述薪资的可靠性。作为今年的校招生&#x…

视频剪辑教程,批量将视频裁切为1:1比例的尺寸

视频太多&#xff0c;如何批量剪辑&#xff0c;比如将视频裁切为1:1的比例呢&#xff1f;那么今天小编给大家带来一个超简单的方法&#xff0c;可以同时将多段16:9的视频裁切为1:1的视频。 所需工具 多段16:9&#xff08;即1280*720&#xff09;的视频素材 操作步骤 第一步&…

C++那些事之高效率开发

1.神器 目前开发C/C用的比较多的当属Vim、VS code、CLion。 Vim配上插件编写C/C效率高的不少。 VSCode配上自定义配置及快捷键、vim插件效率跟vim旗鼓相当。 CLion因其独特的CMakeLists.txt管理方式及强大的代码补全等功能&#xff0c;编写本地代码绝对好于前两者。 但是对…

获B轮融资 官栈如何打破薛定谔式“中式滋补”

日前&#xff0c;滋补头部品牌官栈宣布完成B轮融资&#xff0c;这是其继去年9月完成Pre-B轮融资后&#xff0c;再度获得资本青睐。 近年来&#xff0c;乘国潮东风&#xff0c;中式滋补在沉寂多年后火热翻红&#xff0c;以官栈为代表的新品牌快速崛起&#xff0c;而老字号也紧跟…

非零基础自学Golang 第15章 Go命令行工具 15.5 代码测试(test) 15.5.2 基准测试 15.5.3 覆盖率测试

非零基础自学Golang 文章目录非零基础自学Golang第15章 Go命令行工具15.5 代码测试(test)15.5.2 基准测试15.5.3 覆盖率测试第15章 Go命令行工具 15.5 代码测试(test) 15.5.2 基准测试 基准测试提供可自定义的计时器和一套基准测试算法&#xff0c;能方便快速地分析一段代码…

P5 PyTorch 常用数学运算

前言&#xff1a; 这里主要介绍一下PyTorch 的常用数学运算 目录&#xff1a; 1&#xff1a; add|sub 加减法 2: mul/div 乘/除运算 3: 矩阵乘法 4 2D矩阵转置 5 其它常用数学运算 6 clamp 梯度剪裁 一 加减法 1.1 加法 可以直接通过符号 或者 torch.add # -*- co…

并发编程学习(五):设计模式~同步模式之保护性暂停

1、保护性暂停 模式的定义 保护性暂停 即Guarded Suspension&#xff0c;用于在一个线程等待另一个线程的执行结果。 要点&#xff1a; 有一个结果需要从一个线程传递到另一个线程&#xff0c;让它们关联同一个对象GuardedObject。如果有结果不断从一个线程到另一个线程&…

Redis架构演变之主从、Sentinel哨兵、Cluster(通信、分片、路由等机制)

一. 主从复制 1. 含义 在分布式系统中&#xff0c;为了解决单点问题&#xff0c;通常会把数据复制多个副本到其它机器&#xff0c;满足故障恢复和负载均衡等要求&#xff0c;Redis也是如此&#xff0c;提供了主从复制功能。&#xff08;redis第一代架构&#xff09; 实质&…

程序员35岁就失业了吗?就没有其他路可以选了吗?

前言 回到老家最近感到很迷茫&#xff0c;不知道该做什么&#xff0c;也不知道学习了更多的技术又能干什么。 有句话确实是很符合我现在的处境&#xff1a;时势造英雄&#xff01;虽然我不是英雄&#xff0c;但是我确实需要一个鞥一展所长的环境。 记得当初决定回到哈尔滨&a…

【大话设计模式】工厂+策略+装饰模式 hw01

背景 小李已经是一个工作一年的初级工程师了&#xff0c;他所在的公司是一家大型购物商场。随着各种网络购物软件兴起&#xff0c;老板也想做一个商场的购物 APP。分给小李的是一个一个订单结算模块&#xff0c;需要支持各种不同的结算策略。 需求 请帮小李写一个订单结算模…

vm2 <3.9.10 存在任意代码执行漏洞

漏洞描述 vm2 是一个基于 Node.js 的沙箱环境&#xff0c;可以使用列入白名单的 Node 内置模块运行不受信任的代码。 vm2 3.9.10之前版本中由于 WeakMap.prototype.set 方法使用原型查找从而存在任意代码执行漏洞&#xff0c;攻击者可利用此漏洞在沙箱内执行任意恶意代码&…

盲盒抽奖流程

盲盒模块的流程大致如下&#xff1a; 进入盲盒抽奖页面&#xff0c;需要初始化直接获取一些盲盒的信息&#xff0c;例如&#xff1a;盲盒活动id&#xff0c;开奖buff等。首先需要获取盲盒活动id&#xff0c;后面的所有请求都是基于盲盒活动id进行的。 初始化获取: 盲盒活动id…

Thymeleaf 下拉列表传值示例

参考资料 Spring Boot で Thymeleaf 使い方メモ 目录一. 前期准备二. 实体类.内部类设置下拉列表值2.1 form实体类2.2 Controller层2.3 Thymeleaf页面三. request.setAttribute()设置下拉列表值3.1 定义下拉列表存放类3.2 Controller层3.3 Thymeleaf页面一. 前期准备 枚举类 …

FT2232作为JTAG烧录器的使用步骤详解

FT2232作为JTAG烧录器的使用步骤详解FT2232作为JTAG烧录器的使用步骤详解配置OpenOCD环境(已经配置好的可以跳过)【步骤 1】安装 FT2232HL 芯片的驱动&#xff0c;安装文件为 CDM21228_Setup.exe。【步骤 2】 安装 FT_Prog_v3.6.88.402 Installer.exe【步骤 3】 使用 FT Prog 软…