天池大赛:街景字符编码识别——Part5:模型集成

2023-11-02

街景字符编码识别

更新流程↓
Task01:赛题理解
Task02:数据读取与数据扩增
Task03:字符识别模型
Task04:模型训练与验证
Task05:模型集成
老夜店鸟
炸…炸辽
给朋友看要破壳的鸡蛋
比赛链接


Part5:模型集成





0. 简介


 本章讲解的知识点包括:

  • 分类器集成 / 集成学习
  • 深度学习中的集成学习
  • 结果后处理思路



1. 分类器集成(集成学习)

  集成学习,即分类器集成,通过构建并结合多个学习器来完成学习任务。一般结构是:先产生一组“个体学习器”,再用某种策略将它们结合起来。结合策略主要有平均法、投票法和学习法等。
  集成学习(ensemble learning)通过构建并结合多个学习器来完成学习任务,有时也被称为多分类器系统(multi-classifier system)、基于委员会的学习(committee-based learning)。

  集成学习是这样一个过程,按照某种算法生成多个模型,如分类器或者称为专家,再将这些模型按照某种方法组合在一起来解决某个智能计算问题。集成学习主要用来提高模型(分类,预测,函数估计等)的性能,或者用来降低模型选择不当的可能性。集成算法本身是一种监督学习算法,因为它可以被训练然后进行预测,组合的多个模型作为整体代表一个假设(hypothesis)。

  集成方法是将几种机器学习技术组合成一个预测模型的元算法,以达到减小方差(bagging)偏差(boosting) 或改进预测(stacking) 的效果。

 1.1. 分类器(Classifier)

  分类器是数据挖掘中对样本进行分类的方法的统称,包含决策树逻辑回归朴素贝叶斯神经网络等算法。分类是数据挖掘的一种非常重要的方法。分类的概念是在已有数据的基础上学会一个分类函数或构造出一个分类模型(即分类器)。该函数或模型能够把数据库中的数据纪录映射到给定类别中的某一个,从而可以应用于数据预测。

 分类器的构造和实施大体会经过以下几个步骤:

  • 选定样本(包含正样本和负样本),将所有样本分成训练样本和测试样本两部分。
  • 在训练样本上执行分类器算法,生成分类模型
  • 在测试样本上执行分类模型,生成预测结果
  • 根据预测结果,计算必要的评估指标,评估分类模型的性能

  更多分类器种类可以参考分类器


  1.1.1. 决策树分类器

    限于篇幅,可以点击链接了解具体——原理实现

  1.1.2. 朴素贝叶斯分类器

    素贝叶斯分类器是假设数据样本特征完全独立,以贝叶斯定理为基础的简单概率分类器。限于篇幅,可以点击链接了解具体原理实现

  1.1.3. AdaBoost算法

    AdaBoost算法的自适应在于前一个分类器产生的错误分类样本会被用来训练下一个分类器,从而提升分类准确率,但是AdaBoost算法对于噪声样本和异常样本比较敏感。限于篇幅,可以点击链接了解具体原理与实现

  1.1.4. 支持向量机

    支持向量机是用过构建一个或者多个高维的超平面来将样本数据进行划分,超平面即为样本之间的分类边界。限于篇幅,可以点击链接了解具体原理与实现

  1.1.5. K近邻算法

    基于k近邻的K个样本作为分析从而简化计算提升效率,K近邻算法的分类器是一种基于距离计算的分类器。限于篇幅,可以点击链接了解具体原理与实现



 1.2. 集成学习方法

  集成学习有许多集成模型,例如自助法、自助聚合(Bagging)、随机森林、提升法(Boosting)堆叠法(stacking) 以及许多其它的基础集成学习模型。
  集成方法的思想是通过将这些个体学习器(个体学习器称为“基学习器”,基学习器也被称为弱学习器。
)的偏置和/或方差结合起来,从而创建一个 强学习器(或 集成模型),从而获得更好的性能。
我们可以用三种主要的旨在组合弱学习器的 元算法

  • 自助聚合(Bagging),该方法通常考虑的是同质弱学习器,相互独立地并行学习这些弱学习器,并按照某种确定性的平均过程将它们组合起来。
  • 提升法(Boosting),该方法通常考虑的也是同质弱学习器。它以一种高度自适应的方法顺序地学习这些弱学习器(每个基础模型都依赖于前面的模型),并按照某种确定性的策略将它们组合起来。
  • 堆叠法(Stacking),该方法通常考虑的是异质弱学习器,并行地学习它们,并通过训练一个 元模型 将它们组合起来,根据不同弱模型的预测结果输出一个最终的预测结果。

  非常粗略地说,我们可以说Bagging的重点在于获得一个方差比其组成部分更小的集成模型,而Boosting和Stacking则将主要生成偏置比其组成部分更低的强模型(即使方差也可以被减小)


  1.2.1. 自助聚合(Bagging)

  在 并行化的方法 中,我们单独拟合不同的学习器,因此可以同时训练它们。最著名的方法是自助聚合(Bagging),它的目标是生成比单个模型更棒的集成模型。Bagging的方法实现

  自助法:这种统计技术先随机抽取出作为替代的 B 个观测值,然后根据一个规模为 N 的初始数据集生成大小为 B 的样本(称为自助样本)。
在这里插入图片描述

自助抽样过程示意图

  在某些假设条件下,这些样本具有非常好的统计特性:在一级近似中,它们可以被视为是直接从真实的底层(并且往往是未知的)数据分布中抽取出来的,并且彼此之间相互独立。因此,它们被认为是真实数据分布的代表性和独立样本(几乎是独立同分布的样本)。

  为了使这种近似成立,必须验证两个方面的假设。

  1. 初始数据集的大小N应该足够大,以捕获底层分布的大部分复杂性。这样,从数据集中抽样就是从真实分布中抽样的良好近似(代表性)。
  2. 与自助样本的大小B相比,数据集的规模N应该足够大,这样样本之间就不会有太大的相关性(独立性)。注意,接下来我可能还会提到自助样本的这些特性(代表性和独立性),但读者应该始终牢记:这只是一种近似

  举例而言,自助样本通常用于评估统计估计量的方差或置信区间。根据定义,统计估计量是某些观测值的函数。因此,随机变量的方差是根据这些观测值计算得到的。为了评估这种估计量的方差,我们需要对从感兴趣分布中抽取出来的几个独立样本进行估计。在大多数情况下,相较于实际可用的数据量来说,考虑真正独立的样本所需要的数据量可能太大了。然而,我们可以使用自助法生成一些自助样本,它们可被视为最具代表性以及最具独立性(几乎是独立同分布的样本)的样本。这些自助样本使我们可以通过估计每个样本的值,近似得到估计量的方差。
在这里插入图片描述

自助法经常被用于评估某些统计估计量的方差或置信区间





  1.2.2. 提升法(Boosting)

  在顺序化的方法中,组合起来的不同弱模型之间不再相互独立地拟合。其思想是迭代地拟合模型,使模型在给定步骤上的训练依赖于之前的步骤上拟合的模型。提升法(Boosting) 是这些方法中最著名的一种,它生成的集成模型通常比组成该模型的弱学习器偏置更小。

  Boosting和Bagging的工作思路是一样的:我们构建一系列模型,将它们聚合起来得到一个性能更好的强学习器。然而,与重点在于减小方差的Bagging不同,Boosting着眼于以一种适应性很强的方式顺序拟合多个弱学习器:序列中每个模型在拟合的过程中,会更加重视那些序列中之前的模型处理地很糟糕的观测数据。
  直观地说,每个模型都把注意力集中在目前最难拟合的观测数据上。这样一来,在这个过程的最后,我们就获得了一个具有较低偏置的强学习器(我们会注意到,Boosting也有减小方差的效果)。和Bagging 一样,Boosting也可以用于回归和分类问题。由于其重点在于减小偏置,用于Boosting 的基础模型通常是那些低方差高偏置的模型。例如,如果想要使用树作为基础模型,我们将主要选择只有少许几层的较浅决策树。而选择低方差高偏置模型作为Boosting 弱学习器的另一个重要原因是:这些模型拟合的计算开销较低(参数化时自由度较低)。实际上,由于拟合不同模型的计算无法并行处理(与Bagging 不同),顺序地拟合若干复杂模型会导致计算开销变得非常高。

  一旦选定了弱学习器,我们仍需要定义它们的拟合方式聚合方式。介绍两个重要的Boosting算法:自适应提升(adaboost)梯度提升(gradient boosting)

  简而言之,这两种元算法在顺序化的过程中创建和聚合弱学习器的方式存在差异。自适应提升算法会更新附加给每个训练数据集中观测数据的权重,而梯度提升算法则会更新这些观测数据的值。这里产生差异的主要原因是:两种算法解决优化问题(寻找最佳模型——弱学习器的加权和)的方式不同。
在这里插入图片描述

Boosting会迭代地拟合一个弱学习器, 将其聚合到集成模型中,并「更新」训练数据集,从而在拟合下一个基础模型时更好地考 虑当前集成模型的优缺点。

  1.2.2.1. 自适应adaboost

  在自适应adaboost中,我们将集成模型定义为 L L L个弱学习器的加权和: s L ( . ) = ∑ l = 1 L c l × w l ( . )            其 中 c l 为 系 数 , w l 为 弱 学 习 器 s_{L}(.)=\sum_{l=1}^{L}c_{l}\times w_{l}(.)\; \; \; \; \; 其中c_{l}为系数,w_{l}为弱学习器 sL(.)=l=1Lcl×wl(.)clwl  寻找这种最佳集成模型是一个困难的优化问题。因此,我们并没打算一次性地解决该问题(找到给出最佳整体加法模型的所有系数和弱学习器),而是使用了一种更易于处理的迭代优化过程(即使它有可能导致我们得到次优解)。

  另外,我们将弱学习器逐个添加到当前的集成模型中,在每次迭代中寻找可能的最佳组合(系数、弱学习器)。换句话说,我们循环地将 s l s_{l} sl 定义如下: s l ( . ) = s l − 1 ( . ) + c l × w l ( . ) s_{l}(.)=s_{l-1}(.)+c_{l}\times w_{l}(.) sl(.)=sl1(.)+cl×wl(.)  其中, c l c_{l} cl w l w_{l} wl被挑选出来,使得 s l s_{l} sl是最适合训练数据的模型,因此这是对 s l − 1 s_{l-1} sl1 的最佳可能改进。我们可以进一步将其表示为: ( c l , w l ( . ) ) = a r g c , w ( . ) m i n E ( s l − 1 ( . ) + c × w ( . ) ) = a r g c , w ( . ) m i n ∑ n = 1 N e ( y n , s l − 1 ( x n ) + c × w ( x n ) ) (c_{l},w_{l}(.))=arg_{c,w(.)}minE(s_{l-1}(.)+c\times w(.))=arg_{c,w(.)}min\sum_{n=1}^{N}e(y_{n},s_{l-1}(x_{n})+c\times w(x_{n})) (cl,wl(.))=argc,w(.)minE(sl1(.)+c×w(.))=argc,w(.)minn=1Ne(yn,sl1(xn)+c×w(xn))  其中, E ( . ) E(.) E(.)是给定模型的拟合误差, e ( . , . ) e(.,.) e(.,.)是损失/误差函数。因此,我们并没有在求和过程中对所有 L L L个模型进行「全局优化」,而是通过「局部」优化来近似最优解并将弱学习器逐个添加到强模型中。

  更特别的是,在考虑二分类问题时,我们可以将 adaboost 算法重新写入以下过程:首先,它将更新数据集中观测数据的权重,训练一个新的弱学习器,该学习器重点关注当前集成模型误分类的观测数据。其次,它会根据一个表示该弱模型性能的更新系数,将弱学习器添加到加权和中:弱学习器的性能越好,它对强学习器的贡献就越大。

  因此,假设我们面对的是一个二分类问题:数据集中有N个观测数据,我们想在给定一组弱模型的情况下使用adaboost算法。在算法的起始阶段(序列中的第一个模型),所有的观测数据都拥有相同的权重1/N。然后,我们将下面的步骤重复 L L L次(作用于序列中的 L L L个学习器):

  • 用当前观测数据的权重拟合可能的最佳弱模型
  • 计算更新系数的值,更新系数是弱学习器的某种标量化评估指标,它表示相对集成模型来说,该弱学习器的分量如何
  • 通过添加新的弱学习器与其更新系数的乘积来更新强学习器计算新观测数据的权重,该权重表示我们想在下一轮迭代中关注哪些观测数据(聚和模型预测错误的观测数据的权重增加,而正确预测的观测数据的权重减小)

  重复这些步骤,我们顺序地构建出 L L L个模型,并将它们聚合成一个简单的线性组合,然后由表示每个学习器性能的系数加权。注意,初始adaboost算法有一些变体,比如LogitBoost(分类)或L2Boost(回归),它们的差异主要取决于损失函数的选择。
在这里插入图片描述

Adaboost在每次迭代中更新观测数据的权重。正确分类的观测数据的权重相对于错误分类的观测数据的权重有所下降。在最终的集成模型中,性能更好的模型具有更高的权重。




  1.2.3. 堆叠法(Stacking)

  堆叠法Stacking与Bagging和Boosting主要存在两方面的差异。首先,堆叠法通常考虑的是异质弱学习器(不同的学习算法被组合在一起),而Bagging和Boosting主要考虑的是同质弱学习器。其次,stacking堆叠法学习用元模型组合基础模型,而Bagging和Boosting则根据确定性算法组合弱学习器。

  正如上文已经提到的,堆叠法的概念是学习几个不同的弱学习器,并通过训练一个元模型来组合它们,然后基于这些弱模型返回的多个预测结果输出最终的预测结果。

  因此,为了构建Stacking模型,我们需要定义两个东西:想要拟合的 L L L个学习器以及组合它们的元模型。例如,对于分类问题来说,我们可以选择KNN分类器logistic回归SVM作为弱学习器,并决定学习神经网络作为元模型。然后,神经网络将会把三个弱学习器的输出作为输入,并返回基于该输入的最终预测。所以,假设我们想要拟合由 L L L个弱学习器组成的Stacking集成模型。我们必须遵循以下步骤:

  • 将训练数据分为两组
  • 选择 L 个弱学习器,用它们拟合第一组数据
  • 使 L 个学习器中的每个学习器对第二组数据中的观测数据进行预测
  • 在第二组数据上拟合元模型,使用弱学习器做出的预测作为输入

  在前面的步骤中,我们将数据集一分为二,因为对用于训练弱学习器的数据的预测与元模型的训练不相关。因此,将数据集分成两部分的一个明显缺点是,我们只有一半的数据用于训练基础模型,另一半数据用于训练元模型。
  为了克服这种限制,我们可以使用某种k-折交叉训练方法(类似于 k-折交叉验证中的做法)。这样所有的观测数据都可以用来训练元模型:对于任意的观测数据,弱学习器的预测都是通过在k-1折数据(不包含已考虑的观测数据)上训练这些弱学习器的实例来完成的。换句话说,它会在k-1折数据上进行训练,从而对剩下的一折数据进行预测。迭代地重复这个过程,就可以得到对任何一折观测数据的预测结果。这样一来,我们就可以为数据集中的每个观测数据生成相关的预测,然后使用所有这些预测结果训练元模型。

在这里插入图片描述

Stacking方法会训练一个元模型, 该模型根据较低层的弱学习器返回的输出结果生成最后的输出





 1.3.十折交叉验证

  由于深度学习模型一般需要较长的训练周期,如果硬件设备不允许建议选取留出法,如果需要追求精度可以使用交叉验证的方法。

  十折交叉验证用来测试算法准确性。将数据集分成十份,轮流将其中九份作为训练数据,一份作为测试数据,进行试验。每次试验都会得出相应的正确率(或差错率)。十次的结果的正确率(或差错率)的平均值作为对算法精度的估计,一般还需要进行多次十折交叉验证(例如十次十折交叉验证),再求其均值,作为对算法准确性的估计。

  下面假设构建了十折交叉验证,训练得到十个CNN模型。
在这里插入图片描述
 那么在十个CNN模型可以使用如下方式进行集成:

  • 对预测的结果的概率值进行平均,然后解码为具体字符
  • 对预测的字符进行投票,得到最终字符

  实现方法可以通过十折交叉验证深入理解了解。




2. 深度学习中的集成学习


 此外在深度学习中本身还有一些集成学习思路的做法,值得借鉴学习:
  • 丢弃法Dropout
  • 测试集数据扩增TTA

 2.1. 丢弃法Dropout

  具体原理可以参考天池大赛:街景字符编码识别——Part4:模型训练与验证

  加入丢弃法后的网络结构如下:

# 定义模型
class SVHN_Model1(nn.Module):
    def __init__(self):
        super(SVHN_Model1, self).__init__()
        # CNN提取特征模块
        self.cnn = nn.Sequential(
            nn.Conv2d(3, 16, kernel_size=(3, 3), stride=(2, 2)),
            nn.ReLU(),
            nn.Dropout(0.25),
            nn.MaxPool2d(2),
            nn.Conv2d(16, 32, kernel_size=(3, 3), stride=(2, 2)),
            nn.ReLU(), 
            nn.Dropout(0.25),
            nn.MaxPool2d(2),
        )
        # 
        self.fc1 = nn.Linear(32*3*7, 11)
        self.fc2 = nn.Linear(32*3*7, 11)
        self.fc3 = nn.Linear(32*3*7, 11)
        self.fc4 = nn.Linear(32*3*7, 11)
        self.fc5 = nn.Linear(32*3*7, 11)
        self.fc6 = nn.Linear(32*3*7, 11)
    
    def forward(self, img):        
        feat = self.cnn(img)
        feat = feat.view(feat.shape[0], -1)
        c1 = self.fc1(feat)
        c2 = self.fc2(feat)
        c3 = self.fc3(feat)
        c4 = self.fc4(feat)
        c5 = self.fc5(feat)
        c6 = self.fc6(feat)
        return c1, c2, c3, c4, c5, c6



 2.2. 测试集数据扩增TTA

  具体原理可以参考天池大赛:街景字符编码识别——Part4:模型训练与验证,实现方法参考TTA(Test-Time Augmentation) 之Pytorch

def predict(test_loader, model, tta=10):
   model.eval()
   test_pred_tta = None
   # TTA 次数
   for _ in range(tta):
       test_pred = []
   
       with torch.no_grad():
           for i, (input, target) in enumerate(test_loader):
               c0, c1, c2, c3, c4, c5 = model(data[0])
               output = np.concatenate([c0.data.numpy(), c1.data.numpy(),
                  c2.data.numpy(), c3.data.numpy(),
                  c4.data.numpy(), c5.data.numpy()], axis=1)
               test_pred.append(output)
       
       test_pred = np.vstack(test_pred)
       if test_pred_tta is None:
           test_pred_tta = test_pred
       else:
           test_pred_tta += test_pred
   
   return test_pred_tta



 2.3. Snapshot

  本章的开头已经提到,假设我们训练了10个CNN则可以将多个模型的预测结果进行平均。但是加入只训练了一个CNN模型,如何做模型集成呢?

  在论文Snapshot Ensembles中(论文解读1论文解读2),作者提出使用cyclical learning rate进行训练模型,并保存精度比较好的一些checkopint,最后将多个checkpoint进行模型集成。
在这里插入图片描述
  由于在cyclical learning rate中学习率的变化有周期性变大和减少的行为,因此CNN模型很有可能在跳出局部最优进入另一个局部最优。在Snapshot论文中作者通过使用表明,此种方法可以在一定程度上提高模型精度,但需要更长的训练时间。
在这里插入图片描述



3. 结果后处理

  在不同的任务中可能会有不同的解决方案,不同思路的模型不仅可以互相借鉴,同时也可以修正最终的预测结果。

  在本次赛题中,可以从以下几个思路对预测结果进行后处理:

  • 统计图片中每个位置字符出现的频率,使用规则修正结果
  • 单独训练一个字符长度预测模型,用来预测图片中字符个数,并修正结果。


4. 参考链接

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

天池大赛:街景字符编码识别——Part5:模型集成 的相关文章

随机推荐

  • windows创建软连接

    可用于地址映射 方便统一配置管理 打开cmd执行 创建命令 指令 软连接地址 实际地址 mklink J D bwopt booway bwss D Java Project main insenattendance bwopt boowa
  • Java http请求工具类

    近期使用json请求很多 数据交互格式统一 方便数据转化 但是过时的工具类在后台之间请求时 发现接收到并不是标准的JSON 请求头也有问题 造成很大的困扰 所以整理了一个标准的工具类 import org apache http NameV
  • c语言中八进制输出的格式说明符,C 的输入&输出格式说明符讲解

    C的输入 输出格式说明符讲解 方便你了解C的输入与输出格式的写法 d整型输出 ld长整型输出 o以八进制数形式输出整数 x以十六进制数形式输出整数 或输出字符串的地址 u以十进制数输出unsigned型数据 无符号数 注意 d与 u有无符号
  • win服务器上的虚拟机反应慢,高手解读Win10系统打开vmware特别慢的具体方法

    大家在用win10系统的过程中 各位难免会遇到Win10系统打开vmware特别慢的问题 Win10系统打开vmware特别慢这样的情况还真的把很多电脑高手都为难住了 别着急 我们自己就可以处理掉Win10系统打开vmware特别慢的问题
  • 【毕业季·进击的技术er】 我 能

    你陪我步入蝉夏 越过城市喧嚣 歌声还在游走 你榴花般的双眸 不见你的温柔 丢失花间欢笑 岁月无法停留流云 的等候 在纸短情长里 我们迎来了毕业季 这是告别 也是迈向新起点的开始 本文我从一个大三在校生的角度来讲讲我和编程的那些事 希望技术社
  • Android 系统865虚拟化集成无源码apk示例

    一 环境 高通865虚拟化Android 10 版本 二 具体修改的文件 以集成OppoAnonymousId apk为例 1 新建OppoAnonymousId目录 将apk放到该目录 vendor qcom proprietary pr
  • g2o编译错误

    ORBSLAM2 with pointcloud map g2o with orbslam2 g2o types slam2d edge se2 pointxy bearing cpp 51 39 error cannot convert
  • uniapp uni.setClipboardData成功默认提示

    uni setClipboardData data hello uniapp success function 重点 做笔记 在success中加入uni hideToast 可以解决 uni hideToast 以下就可自定义操作了 fa
  • SpringBoot(八)拦截器Interceptor

    上篇介绍了Filter过滤器的使用 提起过滤器 就不得不再提起另外一个叫做拦截器的东西 两者的作用类似 都可以实现拦截请求的作用 但其实两者有着非常大的区别 本篇 我们就来学习下拦截器的使用 如果你是新手 且没看过我之前的一系列Spring
  • Ubuntu系统使用光盘作为apt-get源

    1 将系统光盘插入光驱 接入系统 并挂载 mount dev sr0 mnt 2 修改apt get源 将光驱挂着的目录加入源 vim etc apt sources list 在首行加入 deb file mnt trusty main
  • 【Linux服务器】 .bashrc设置永久环境变量后不起作用的问题

    在使用vi打开 bashrc文件以后设置环境变量 vim bashrc export PATH PATH home uusama mysql bin 然而发现设置了以后不起作用 这时候可以在终端界面使用export命令查看当前所有的PATH
  • 基于Aidlux的自动驾驶智能预警方案

    forewarning py为智能预警代码 运行后视频结果如下所示 基于Aidlux的自动驾驶智能预警方案 YOLOP导出onnx模型 执行命令 python3 export onxx py height 640 width 640 执行完
  • 问题 E: 括号的最大嵌套深度

    题目描述 如果字符串满足以下条件之一 则可以称之为 有效括号字符串 valid parentheses string 可以简写为 VPS 字符串是一个空字符串 或者是一个不为 或 的单字符 字符串可以写为 AB A 与 B 字符串连接 其中
  • 机器学习课后习题 --- 逻辑回归

    一 单选题 1 一监狱人脸识别准入系统用来识别待进入人员的身份 此系统一共包括识别4种不同的人员 狱警 小偷 送餐员 其他 下面哪种学习方法最适合此种应用需求 A 二分类问题 B 多分类问题 C 回归问题 D 聚类问题 2 以下关于分类问题
  • webpack5基本教程-1

    基本使用 Webpack 是一个静态资源打包工具 它会以一个或多个文件作为打包的入口 将我们整个项目所有文件编译组合成一个或多个文件输出出去 输出的文件就是编译好的文件 就可以在浏览器段运行了 我们将 Webpack 输出的文件叫做 bun
  • nginx 超时配置说明

    keepalive timeout 默认75s 通常keepalive timeout应该比client body timeout大 如果值为0 则响应头Connection close Syntax keepalive timeout t
  • android log缓冲区大小,科普:开发者模式日志记录缓冲区到底怎样设置

    概念 志缓冲区是小型的 用于短期存储将写入到磁盘上的重做日志的变更向量的临时区域 变更向量 是应用于某些对象的修改 执行DML语句会生成应用于数据的变更向量 有了重做日志 数据库就可以确保数据永不丢失 每当数据块发生更改时 都会将应用于块的
  • 微信开发时, 如何进行服务器验证及接收回复信息呢? 分享原生PHP代码如下:

    if isset GET echostr signature GET signature timestamp GET timestamp nonce GET nonce 验证时会传递这个信息 echostr GET echostr toke
  • STM32_超声波测距

    超声波测距 超声波测距原理 超声波模块说明书 超声波注意事项 HMI串口屏 代码解析 测距结果 超声波测距原理 利用声音测距 声音在空气中的速度是340m s 15 当声音传播时 若遇到障碍物时 就会被反弹回来 通过计时反弹回来的时间就可以
  • 天池大赛:街景字符编码识别——Part5:模型集成

    街景字符编码识别 更新流程 Task01 赛题理解 Task02 数据读取与数据扩增 Task03 字符识别模型 Task04 模型训练与验证 Task05 模型集成 老夜店鸟 炸 炸辽 给朋友看要破壳的鸡蛋 比赛链接 Part5 模型集成