当前位置:   article > 正文

融合卷积和注意力机制:有效整合它们优势的方法概述

融合卷积和注意力机制:有效整合它们优势的方法概述

1. 介绍

CNNs和Transformers在计算机视觉领域都取得了巨大成功,但它们的底层原理不同,导致它们在学习数据表示方面有着不同的优势和局限性。

CNNs以稀疏连接和参数共享为特点,更注重局部结构,拥有较少的参数。因此,即使在相对较小的数据集上进行训练时(例如ImageNet),它们也能很好地泛化,但在捕捉全局关系方面表现欠佳,尤其是与Transformers相比。

另一方面,Transformers具有密集连接,并且根据输入值动态调整连接权重,因此它们更容易学习复杂的全局关系,具有更强的表现能力。但由于其高表现力,需要在非常大的数据集上进行训练(如JFT 300M),以避免过拟合问题。

尽管开源分类数据集的大小在不断增加,但许多应用程序(如数字病理学、气候、体育等)需要特定的数据,因此数据集往往较小。此外,由于标签复杂度增加,检测和分割数据集的大小通常比分类数据集小得多。考虑到CNNs和Transformers的学习偏差及其优缺点,我们面临的问题是:我们能否将这两种方法结合起来,以获得最佳的效果?

2. 模型学习偏差及其后果

每当我们设计机器学习系统来解决某个问题时,我们会根据我们对问题的了解和之前的信念来选择模型的结构。比如说,如果我们觉得处理序列对解决自然语言处理问题有帮助,那么我们就可能选择使用像RNN和LSTM这样的序列模型。每当我们这样选择时,其实我们就是在系统中引入一种偏好,我们称之为学习偏差

要理解学习偏差的影响,可以把它想象成一种约束,就像把我们寻找最优解的范围限定在某种特定类型的模型之内。这意味着,不同的学习偏差会导致我们得到完全不同的模型。所以,我们需要理解学习偏差的后果,以便设计出更好的模型。

学习偏差其实就是我们在设计机器学习模型时,基于我们的经验、信念或者已有的知识,对某些模型结构或者参数做出的一种偏好或者假设。简单来说,就是我们对问题的理解和解决方式的一种倾向性偏见。

接下来,将简单地介绍全连接层、卷积层和自注意力层的工作原理。主要是为了更清楚地理解学习偏差的概念

2.1 全连接层

在这里插入图片描述

如果在第 l l l层,输入和输出分别为 X 4 × 4 X_{4\times4} X4×4(即一个类似图像的单通道输入)和 Y 4 × 4 Y_{4\times4} Y4×4(即一个类似图像的单通道输出)。那么,如果 l l l是一个全连接层,节点 i , j i,j i,j处的预激活 logit 值,即 y i , j y_{i,j} yi,j ,由以下公式给出:

y i , j = ∑ k = 0 4 ∑ l = 0 4 w k , l i , j x k , l y_{i,j}=\sum_{k=0}^{4}\sum_{l=0}^{4} w_{k,l}^{i,j}x_{k,l} yi,j=k=04l=04wk,li,jxk,l

也就是说,每个节点处的 logit 是所有输入激活 x i , j x_{i,j} xi,j的加权和。用于计算节点 y i , j y_{i,j} yi,j的加权和的权重是网络参数的一部分,并且在训练过程中学习得到的。这种架构是基于感知器的神经网络层,而加权和的计算灵感来自于我们大脑中神经元之间的通信方式。在这里,用加权和来计算 logit 就是学习偏差。

学习偏差包括

  1. 一般来说,对于两个节点 y a , b y_{a,b} ya,b y c , d y_{c,d} yc,d: W 4 × 4 a , b ≠ W 4 × 4 c , d W_{4\times4}^{a,b} \neq W_{4\times4}^{c,d} W4×4a,b=W4×4c,d ,也就是说,对于每个节点 y i , j y_{i,j} yi,j,都会学习到一个独立的权重矩阵 W 4 × 4 i , j W_{4\times4}^{i,j} W4×4i,j用于计算加权和。
  2. 每个节点 y i , j y_{i,j} yi,j与前一层的每个节点都相连。
  3. 对于每个权重矩阵 W 4 × 4 i , j W_{4\times4}^{i,j} W4×4i,j ,一旦学习到,权重就固定下来,不依赖于输入。

上述学习偏差的一些后果是

  1. 每个节点的权重都不同,这意味着网络在计算或检测输入时会考虑到完全不同的特征或模式。换句话说,每个节点学到的是独特的特征表示,这可能导致网络无法很好地泛化到新的数据上。
  2. 网络对输入进行轻微的变化或移动,网络的表现也会受到影响。(不具有鲁棒性)举例来说,假设某个权重 w 2 , 3 1 , 1 w_{2,3}^{1,1} w2,31,1连接了输出节点 y 1 , 1 y_{1,1} y1,1和输入节点 x 2 , 3 x_{2,3} x2,3。当计算 y 1 , 1 y_{1,1} y1,1处的logit加权和时,使用了 x 2 , 3 x_{2,3} x2,3乘以 w 2 , 3 1 , 1 w_{2,3}^{1,1} w2,31,1。然而,如果将输入 X X X向左移动一个像素,那么在计算 y 2 , 3 y_{2,3} y2,3时,应该使用 x 2 , 4 x_{2,4} x2,4,而不是 x 2 , 3 x_{2,3} x2,3。由于每个节点的权重都是独立学习的,这种架构对于输入节点保持特定顺序的数据场景更加适用,比如人的特征 [身高、体重、年龄]。但对于图像来说,由于图像中感兴趣对象的尺度和位置可能会有很大的变化,这种架构可能不够鲁棒。
  3. 由于每个权重矩阵都不同,网络需要学习的参数数量很多,因此过拟合可能成为一个潜在的问题。这意味着网络可能会在训练集上表现良好,但在未见过的数据上表现不佳。

2.2 卷积层

在这里插入图片描述
针对计算机视觉任务,图像中感兴趣对象的相对位置和尺度可能在不同的图像中有很大的变化。通常情况下,我们可以用一个较小的局部窗口来捕获关键的低级视觉特征(如边缘),然后在后续的层中将这些特征聚合起来,以识别更高级的特征(如物体)。

为了实现上述观点,一种基于滑动窗口的方法被提出。在这种方法中,我们在图像上滑动一个小的窗口(通常为 n × n n \times n n×n,在本例中为 n = 3 n=3 n=3),并且在每个位置,我们使用一个学习到的权重滤波器/核 W n × n W_{n \times n} Wn×n从特定的 n × n n \times n n×n的局部邻域计算加权和。这里的想法是,学习到的滤波器权重 W n × n W_{n \times n} Wn×n对应于特定的局部视觉特征(如边缘、纹理等),并且对这些特征的存在会给出高的加权和/对数值。换句话说,它们指示了这些小特征的出现。通过在整个图像上滑动相同的滤波器,我们试图在图像的各个位置多次检测这些特征。因此,我们能够检测到这些特征在图像中的任何位置出现,这就是卷积神经网络中的学习偏差。

在卷积层中,假设在第 l l l层,输入为 X 4 × 4 X_{4 \times 4} X4×4(即一个单通道的图像输入),输出为 Y 4 × 4 Y_{4 \times 4} Y4×4(即一个单通道的图像输出)。那么,节点 ( i , j ) (i,j) (i,j)处的预激活logit,即 y i , j y_{i,j} yi,j,由以下公式给出:

y i , j = ∑ k = − 1 1 ∑ l = − 1 1 w k , l i , j x i + k , j + l y_{i,j}=\sum_{k=-1}^{1}\sum_{l=-1}^{1} w_{k,l}^{i,j}x_{i+k,j+l} yi,j=k=11l=11wk,li,jxi+k,j+l

这意味着节点 y i , j y_{i,j} yi,j处的logit是以 x i , j x_{i,j} xi,j为中心的 3 × 3 3 \times 3 3×3局部邻域内输入激活的加权和。这里选择的局部邻域是以 x i , j x_{i,j} xi,j为中心的 3 × 3 3 \times 3 3×3窗口。需要注意的是,所有节点在计算加权和时都使用相同的权重,并且这些权重是网络在训练期间学习到的一部分。这种方法被选择是因为我们相信在图像任务中,使用滑动小滤波器的方法是很合适的。

学习偏差包括

  1. 对于 Y Y Y中的任意两个节点 y a , b y_{a,b} ya,b y c , d y_{c,d} yc,d: W 4 × 4 a , b = W 4 × 4 c , d = W 4 , 4 W_{4\times4}^{a,b} = W_{4\times4}^{c,d} = W_{4,4} W4×4a,b=W4×4c,d=W4,4即所有节点共享相同的权重。
  2. 每个节点 y i , j y_{i,j} yi,j都是稀疏连接的,即只连接到前一层的一个小邻域的单个节点。
  3. 对于每个权重矩阵 W 4 × 4 i , j W_{4 \times 4}^{i,j} W4×4i,j一旦学习了权重,它们就是固定的,不依赖于输入。

以上学习偏差的一些后果包括

  1. 权重共享的平移等变性: 当我们说所有节点之间的权重共享时,意味着在卷积神经网络(CNN)中,每个滤波器的权重在整个图像上是共享的。这意味着如果输入图像沿某个方向移动,输出也会相应地沿着相同的方向移动。这种特性使得网络具有平移等变性,即对于同一对象的不同位置,网络会产生相似的响应。
  2. 局部邻域偏好与全局依赖关系之间的权衡: 对于视觉任务来说,对局部邻域的偏好通常是有益的,因为在大多数情况下,我们只需要关注图像中的局部结构来识别对象的特征。但是,这种偏好也有一个代价,即网络很难学习到图像中的全局依赖关系。为了解决这个问题,通常会通过堆叠多个卷积层来逐渐扩大感受野,从而捕获更广泛的上下文信息。但这种方法可能会导致信息丢失,并不一定是最有效的方式。
  3. 权重共享和稀疏连接的减少参数数量和过拟合问题: CNN中的权重共享和稀疏连接可以减少网络的参数数量,这有助于减轻过拟合问题。因为参数的数量减少了,网络更容易泛化到新的数据。
  4. 尺度变化的稳健性: 尽管单独设计的卷积层对于尺度变化并不稳健,但由于CNN通常有多个层次,以及在网络中的分层堆叠和池化等操作,使得CNN对于图像中对象的尺度变化具有一定的稳健性。虽然单个卷积层可能无法捕获所有尺度的信息,但通过堆叠多个层次,并使用池化来减少空间尺寸,网络可以逐渐适应不同尺度的特征。

2.3 自注意力层

在这里插入图片描述

让网络权重依赖于输入是有意义的,即每个输入都会使用一组不同的权重进行处理,这些权重是专门为该输入计算的。这种学习偏差可以使网络对对象的相对位置和图像中对象的相对尺度的变化具有鲁棒性。动态权重计算的另一种看法是,根据输入,我们让网络决定它想要更多关注哪些像素位置(权重较大),以及哪些位置它想要忽略(权重较小),也就是说,我们让网络根据给定的输入决定它想要关注的地方!这就是各种注意力层的学习偏差。在这种层中,网络不是直接学习权重,而是学习一个权重计算函数,然后可以将该函数应用于任何给定的输入,以计算该输入的权重。上面的图示了一个简化的Q、K和V注意力层,其中节点 i , j i,j i,j处的logits由以下公式给出:

y i , j = ∑ k = 0 4 ∑ l = 0 4 w k , l i , j f V ( x k , l ) y_{i,j}=\sum_{k=0}^{4}\sum_{l=0}^{4} w_{k,l}^{i,j}f_{V}(x_{k,l}) yi,j=k=04l=04wk,li,jfV(xk,l)

w k , l i , j = S o f t m a x ( e i , j 0 , 0 , . . . . . , e i , j 4 , 4 ) w_{k,l}^{i,j} = Softmax(e^{i,j}{0,0},.....,e^{i,j}{4,4}) wk,li,j=Softmax(ei,j0,0,.....,ei,j4,4)

e k , l i , j = F a t t n ( f Q ( x i , j ) , f K ( x k , l ) ) e_{k,l}^{i,j} = F_{attn}(f_{Q}(x_{i,j}),f_{K}(x_{k,l})) ek,li,j=Fattn(fQ(xi,j),fK(xk,l))

F a t t n ( f Q ( x i , j ) , f K ( x k , l ) ) = f Q ( x i , j ) ⋅ f K ( x k , l ) T d K F_{attn}(f_{Q}(x_{i,j}),f_{K}(x_{k,l}))= \frac{f_{Q}(x_{i,j})\cdot f_{K}(x_{k,l})^T}{\sqrt{d_{K}}} Fattn(fQ(xi,j),fK(xk,l))=dK fQ(xi,j)fK(xk,l)T

学习偏差包括

  1. 一般来说,对于给定的输入 X X X和两个节点 y a , b y_{a,b} ya,b y c , d y_{c,d} yc,d: W 4 × 4 , X a , b ≠ W 4 × 4 , X c , d W_{4\times4,X}^{a,b} \neq W_{4\times4,X}^{c,d} W4×4,Xa,b=W4×4,Xc,d以及对于两个给定的输入 X 1 , X 2 X_1,X_2 X1,X2: W 4 × 4 , X 1 a , b ≠ W 4 × 4 , X 2 a , b W_{4\times4,X_{1}}^{a,b} \neq W_{4\times4,X_{2}}^{a,b} W4×4,X1a,b=W4×4,X2a,b也就是说,对于每个节点 y i , j y_{i,j} yi,j,都会使用一个单独的权重矩阵 W 4 × 4 i , j W_{4 \times 4}^{i,j} W4×4i,j来计算加权和。
  2. 每个节点 y i , j y_{i,j} yi,j都与前一层的每个节点相连接

以上学习偏差的一些后果包括

  1. 位置和尺度的鲁棒性:每个节点的权重是根据输入动态计算的,这意味着网络可以根据输入数据的不同部分选择关注的位置。因此,网络对于图像中对象的相对位置和尺度的变化具有鲁棒性。简而言之,即使对象在图像中移动或改变尺寸,网络仍能正确识别它们。
  2. 局部关注的缺失:当前网络结构没有专门的机制来强调图像的局部邻域。然而,在视觉任务中,对于对象的识别和分类,通常需要更多地关注局部信息,例如边缘、纹理等。虽然模型可以从数据中学习到局部信息的重要性,但为了更好地处理这些信息,需要大量的训练数据。
  3. 过拟合的风险:由于网络的权重是密集连接的,并且对于每个像素都是不同的,这意味着网络必须学习大量的参数。这样的网络结构容易受到过拟合的影响,特别是当训练数据有限时。过拟合会导致模型在训练数据上表现良好,但在新数据上表现不佳。因此,在设计网络时,需要考虑到过拟合问题,并采取适当的措施来缓解这一问题,例如使用正则化方法或增加训练数据量。

3. 融合卷积与注意力的学习方法

为了克服卷积神经网络(CNNs)和注意力机制的各自学习偏差,已经提出了几种方法。这些方法大致可分为以下三类:

  1. 外部融合方法:这些方法分别应用卷积和注意力,然后以不同方式将它们的输出结合起来。
  2. 内在融合方法:这些方法将卷积和注意力融合为单个操作。
  3. 外部+内在融合方法:这些方法将卷积和注意力融合为单个操作符(内在),然后在此基础上应用常规的卷积或注意力操作(外部)。

接下来,让我们深入探讨一些这些技术。

3.1 Squeeze-and-Excitation网络

在这里插入图片描述

外部融合方法
论文地址:https://arxiv.org/abs/1709.01507

在"Squeeze-and-Excitation Networks"论文中,作者引入了Squeeze-and-Excitation(SE)块,以将卷积和注意力结合起来。这种方法旨在克服卷积神经网络(CNNs)中存在的学习偏差,并引入了注意力机制,以动态调整每个通道中的激活。让我们一起来理解这个过程。

首先,经过卷积层后,我们得到了输出体积 U H × W × N o u t U_{ H\times W\times N_{out}} UH×W×Nout,这是基于卷积的输出。然后,通过全局平均池化操作,我们将 U H × W × N o u t U_{ H\times W\times N_{out}} UH×W×Nout压缩成一个大小为 S 1 × 1 × N o u t S_{1\times1\times N_{out}} S1×1×Nout的全局信息向量。接下来,通过一个多层感知机(MLP),我们将全局信息向量转换为注意力权重 A 1 × 1 × N o u t A_{1\times1\times N_{out}} A1×1×Nout

有了注意力权重,我们可以对 U H × W × N o u t U_{ H\times W\times N_{out}} UH×W×Nout进行缩放,以根据输入动态调整不同通道的信息。最终,我们得到了SE块的输出 Y H × W × N o u t Y_{H\times W\times N_{out}} YH×W×Nout,这是基于注意力的操作。通过这种方式,SE块结合了卷积和注意力,以学习本地和全局上下文,并专注于相关模式。

现在,让我们深入探讨一些关键问题和思考:

  1. “基于通道的” 注意力是做什么的?
    在卷积层中,每个通道对应于特定的视觉特征或模式。通过基于通道的注意力,模型可以根据输入动态地选择关注不同通道的输出,从而提高了网络的表现和泛化能力。
  2. Squeeze操作捕捉到什么?
    Squeeze操作通过全局平均池化聚合了全局信息,从而得到了每个通道的频率和强度分布。这有助于模型动态地调整通道的重要性,以更好地捕捉图像中的关键特征。
  3. 为什么不是空间注意力?
    尽管空间注意力可能有其优势,但作者可能考虑到了计算开销的问题。基于通道的注意力提供了一种轻量级的方法,可以在不增加太多计算成本的情况下增强模型的性能。
  4. 在Squeeze操作时是否丢失了太多信息?
    全局平均池化操作确实丢失了一些空间信息,但作者可能认为这种信息的价值相对较低,不值得增加额外的计算成本来保留它。在实际操作中,需要权衡空间信息和计算成本之间的关系。

通过SE块,我们可以看到,卷积和注意力的结合可以提高模型的性能,而且在计算和内存成本方面的额外开销相对较小。

3.2 卷积块注意力模块

在这里插入图片描述

论文地址:https://arxiv.org/pdf/1807.06521.pdf
外部融合方法

在《卷积块注意模块(CBAM)》论文中,作者提出了一种对SE块的扩展,不仅包括通道注意力,还结合了空间注意力。这个想法在高层次上类似于SE块,但有一些修改:

  1. (修改后的)通道注意力:

在SE块中,挤压操作通过全局平均池化得到一个大小为 S 1 × 1 × C S_{1\times1\times C} S1×1×C的体积。CBAM提出了一个额外的挤压操作:全局最大池化,以获得两个挤压后的体积: S 1 × 1 × C a v g . p o o l S_{1\times1\times C}^{avg. pool} S1×1×Cavg.pool S 1 × 1 × C m a x p o o l S_{1\times1\times C}^{max pool} S1×1×Cmaxpool。这两个体积通过共享的多层感知器(MLP)处理后相加,并通过sigmoid激活得到最终的通道注意力权重。作者通过实验证明,使用两个来自平均池化和最大池化的挤压向量比使用一个更好。

  1. 空间注意力:

除了通道注意力外,他们还提出了执行空间注意力。空间注意力权重是从经过通道注意力调整后的输出 Y H × W × C ′ Y_{H\times W\times C}^{'} YH×W×C上计算和应用的。首先,通过对 U H × W × N o u t U_{ H\times W\times N_{out}} UH×W×Nout进行全局平均池化和全局最大池化,获得 S H × W a v g . p o o l S_{H\times W}^{avg.pool} SH×Wavg.pool S H × W m a x . p o o l S_{H\times W}^{max.pool} SH×Wmax.pool。然后,将它们沿着通道轴连接起来,通过一个 7 × 7 7×7 7×7的卷积滤波器,再通过sigmoid激活,得到空间注意力权重。然后,使用空间注意力对 Y H × W × C ′ Y_{H\times W\times C}^{'} YH×W×C进行缩放,得到最终的输出 Y H × W × C Y_{H\times W\times C} YH×W×C。作者通过实验证明,添加空间注意力可以改善结果。作者还尝试了并行计算通道和空间注意力,但在实践中发现这种配置效果最好

现在,让我们深入探讨一些关键问题和思考:

  1. 基于最大池化的挤压操作的额外信息:最大池化捕获了关于模式匹配强度的信息,这对模型是有用的。在空间注意力计算中,这一点更加直观,我们将在下文讨论。
  2. 为什么需要局部空间注意力:使用局部邻域来计算空间注意力是有意义的。在这里,我们考虑了局部信息,这对网络学习每个位置的注意力权重来缩放信息是有帮助的。然而,如果网络在这个阶段能够获得全局 H × W H \times W H×W的信息,那么它可能会学习到更好的空间注意力特征,但这会增加计算成本

计算和内存成本

考虑到Squeeze 操作和唯一的 7 × 7 7×7 7×7 卷积,额外的计算成本并不太高。与类似的典型CNN相比,没有太多的开销。

比较

这提高了性能,优于Squeeze and Excitation Networks。

3.3 相对自注意力

在这里插入图片描述

论文地址:https://arxiv.org/pdf/1803.02155.pdf
内在融合方法

这篇论文介绍了一种修改注意力机制的方法,通过引入一些新的参数,这些参数是根据它们之间的相对位置相似性而共享的,而不考虑它们的绝对位置。我们着重讨论了其中一种修改方式,这种方式被认为是最有效的,并且后来在与本文相关的后续研究中被广泛采用。

CNN 之所以能够捕捉到相对位置信息,是因为它们采用了参数共享的方法。由于这种参数共享,如果两对像素 p 1 a , p 2 a p_{1}^a,p_{2}^a p1a,p2a p 1 b , p 2 b p_{1}^b,p_{2}^b p1b,p2b之间的相对位置相同(例如, p 2 a p_{2}^a p2a p 1 a p_{1}^a p1a的右侧 3 个像素、下侧 4 个像素,而 p 2 b p_{2}^b p2b p 1 b p_{1}^b p1b的右侧 3 个像素、下侧 4 个像素),那么它们之间的影响也会相同: p 2 a p_{2}^a p2a p 1 a p_{1}^a p1a的影响方式与 p 2 b p_{2}^b p2b p 1 b p_{1}^b p1b的影响方式完全相同。

受此启发,作者提出了一种修改注意力机制的方法,其中引入了新的参数,这些参数根据它们的相对位置相似性而共享,与绝对位置无关。我们将主要讨论一种特殊的修改方式,该方式被认为是最有效的,并且后来在相关的研究中得到了广泛应用。

通常情况下,计算位置 i i i处的输出 Y i Y_i Yi,以关注位置 j j j处的值向量的逻辑为:

e i j = ( X i q ) T d k ( X j k ) e_{ij}=\frac{(X_{i}^{q})^{T}}{\sqrt d_{k}} (X_{j}^k) eij=d k(Xiq)T(Xjk)

以上注意力形式没有依赖于 i , j i,j i,j的相对位置的参数,所有参数都依赖于绝对的 i , j i,j i,j为了引入这种转换等变性的成分,作者提出在键中添加相对位置嵌入,这样对于所有 i , j i,j i,j,只要 j − i j−i ji 是相同的,同一个嵌入就是相同的。修改后的形式如下:

e i j = ( X i q ) T d k ( X j k + r j − i ) e_{ij}=\frac{(X_{i}^{q})^{T}}{\sqrt d_{k}} (X_{j}^k + r_{j-i}) eij=d k(Xiq)T(Xjk+rji)

这里, r j − i r_{j−i} rji是在计算注意力逻辑时添加到键值中的相对位置嵌入。所有具有相同 j − i j−i ji 值的 i , j i,j i,j 对将使用相同的参数
r j − i r_{j−i} rji ,即 e 10 , 15 ; e 20 , 25 e_{10,15}; e_{20,25} e10,15;e20,25都使用 r 5 r_5 r5(请注意,
e 15 , 10 e_{15,10} e15,10 将使用 r − 5 r_{−5} r5而不是 r 5 r_5 r5 )。这将使整个计算中的一小部分具有平移等变性,这仍然是我们认为有帮助的方向。如果模型的输入序列长度为 N,则将有 2 N − 2 2N−2 2N2 种不同的可能的 r j − i r_{j−i} rji ,即在一个极端情况下,你将有 i = 1 , j = N i=1,j=N i=1,j=N
j − i = N − 1 j−i=N−1 ji=N1,在另一个极端情况下,你将有 i = N , j = 1 i=N,j=1 i=N,j=1 j − i = 1 − N j−i=1−N ji=1N,因此 j − 1 j−1 j1 的总可能性为 ( N − 1 ) − ( 1 − N ) = 2 N − 2 (N−1)−(1−N)=2N−2 (N1)(1N)=2N2。每个都将具有与键相同的维度 d k d_k dk 。因此,将有 2 N − 2 2N−2 2N2 个新的位置嵌入参数。

现在,让我们深入探讨一些关键问题和思考:

添加相对位置嵌入可以看作是将全局卷积滤波器及其产生的输出添加到预 softmax 注意力权重中。因此,它直观地将卷积和注意力结合起来。

作者没有在计算机视觉领域进行该方法的实验,后续的论文扩展了这个想法,并将其应用于计算机视觉。

3.4 注意力增强卷积网络

在这里插入图片描述

论文地址:https://arxiv.org/pdf/1904.09925.pdf
外在+内在的融合方法

这篇论文提出了“注意力增强卷积”块,将卷积和注意力的学习偏差集成到两个地方:

  1. 如上图所示,这些块同时对输入进行自注意力计算和卷积操作,然后将这两个输出串联起来以获得注意力增强卷积的输出。
  2. 这里使用的注意力机制是2D相对自注意力,是我们之前讨论过的1D相对自注意力的扩展。因此,注意力机制本身也引入了一些卷积的学习偏差,比如一些参数具有平移等变性。2D相对自注意力的logits计算如下:

e i j = ( X i q ) T d k ( X j k + r j x − i x W + r j y − i y H ) e_{ij}=\frac{(X_{i}^{q})^{T}}{\sqrt d_{k}} (X_{j}^k + r_{j_{x}-i_{x}}^W+r_{j_{y}-i_{y}}^H) eij=d k(Xiq)T(Xjk+rjxixW+rjyiyH)
如果输入体积的大小是 H × W × C H \times W\times C H×W×C,每个相对位置嵌入将具有 c 个参数,并且将具有不同的相对位置嵌入,因此会有 2 ( H + W ) − 2 ) C 2(H+W)-2)C 2(H+W)2)C个参数。

现在,让我们深入探讨一些关键问题和思考:

由于连接的输出具有来自卷积层和注意力层的通道,因此下游层将可以访问局部和全局特征,这应该可以使模型学习到更好的特征。

计算和内存成本

与正常的注意力机制相比,这确实具有较高的内存成本,但通过优化实现方式可以使其更加高效(请参考论文获取更多详细信息)。此外,他们从网络的末尾开始添加这些层,因为在那里空间维度最小。

比较

注意力增强卷积网络改进了CBAM。

3.5 使用变换器进行端到端目标检测

在这里插入图片描述

论文地址:https://arxiv.org/pdf/2005.12872.pdf
外在融合方法

这篇论文介绍了目标检测的DEtection TRansformer(DETR)框架。该框架直接整合了卷积和注意力的优势。

通常,像“Faster RCNN”这样的目标检测框架具有卷积特征提取器(CNN主干)、区域提议预测头、边界框和类别预测头。CNN主干的任务是从输入图像中提取所有相关的视觉特征。区域提议头使用CNN主干较早层的信息来预测图像的潜在显著区域(即可能包含对象的区域),称为ROI(感兴趣区域)。然后,分类和边界框预测头专门在这些ROI上操作,并使用这些区域的CNN提取的特征来进行边界框、类别预测。

DETR框架也有卷积特征提取器(CNN主干)、类别和边界框预测头,但是,DETR没有区域提议预测头,而是有一个编码器-解码器Transformer阶段。典型的CNN(如ResNET50等)用作CNN主干来提取视觉特征,然后编码器-解码器Transformer块获取CNN主干计算的丰富视觉特征,并对整个图像的显著区域应用注意力,并使用来自CNN主干的相应特征提取出CNN主干本身无法提取的更复杂和全局的模式,然后这些模式由边界框、类别预测头(这些是简单的前馈网络)用于进行类别、边界框预测。因此,DETR框架以这种方式将CNNs的优势与Transformers融合起来。

请注意,DETR还有另一个关键组成部分——双部分损失函数,以使用该框架进行目标检测。但是,由于这与本文主题无关,我不会在此处讨论它。如果您想使用该框架,可以在上面链接的DETR论文中找到所有细节。

现在,让我们深入探讨一些关键问题和思考:

这是Faster RCNN框架的一种泛化。
这可以被视为Faster RCNN框架的一种泛化。在Faster RCNN框架中,区域提议网络进行ROI预测。在此步骤之后,网络的所有后续阶段都只关注预测的ROI,这可以被视为一种形式的注意力——硬注意力。在DETR中,我们不是固定一个ROI,而是将整个卷积体积提供给Transformer机制,并让网络决定它想要关注的位置和每个像素的权重。也就是说,这是一种软注意力机制。因此,这种方法比RCNN模型表现更好是完全合理的,因为当我们应用硬注意力(RCNN)时,可能会丢失一些信息。

计算和内存成本

与Faster RCNN框架相比,DETR的帧速率(FPS)较低,尽管参数更少。

比较

性能优于Faster RCNN。

3.6 CvT:将卷积引入视觉变换器

论文地址:https://arxiv.org/pdf/2103.15808.pdf
内在融合方法

CvT论文介绍了卷积视觉变压器。正如名称所示,作者通过在变压器块的两个位置引入卷积操作,将卷积和注意力机制结合起来。

每个阶段开始的卷积标记嵌入
在每个阶段的开始,有一个卷积标记嵌入层。这是一个常规的卷积层,使用步幅 s s s运行。这应用于该层的输入(在内部层中, H i n W i n × C i n H^{in}W^{in}\times C^{in} HinWin×Cin形状的序列输入首先被重塑为适当的 H i n W i n × C i n H^{in}W^{in}\times C^{in} HinWin×Cin形状)。卷积标记嵌入的输出大小 H o u t ×   W o u t × C o u t H^{out}\times\ W^{out}\times C^{out} Hout× Wout×Cout根据步幅
s s s和滤波器数量 C o u t C^{out} Cout来定义。使用卷积标记嵌入确保了在基于注意力的输出上学习到重要的局部表示,它还实现了空间下采样,同时增加了特征图数量(通道维度),类似于CNN。

用于注意力的卷积投影
普通的变压器使用3个不同的线性投影来生成Q、K和V嵌入。在CvT的情况下,作者提出用3个不同的深度卷积替换这3个不同的线性投影。这可能使得更好地投影到Q、K和V嵌入中,因为在给定位置的Q、K和V嵌入现在取决于该位置的局部邻域,这通常是有效的,根据我们从CNN中所知的内容。

通过消融研究,作者经验性地证明了所提出的卷积标记嵌入和卷积投影提高了模型性能的有效性(无论单独使用还是组合使用)。此外,作者还表明CvT不需要使用位置编码/嵌入,事实上不使用它们会提高CvT的性能。这表明引入的卷积有助于网络保留关于相对空间位置的信息。

现在,让我们深入探讨一些关键问题和思考:

卷积滤波器对注意力头的信息增强至关重要。

在应用于上一阶段输出时,卷积标记嵌入层实际上融合了基于自注意力计算的全局特征信息。这意味着,通过类似卷积的本地过滤器,网络可以学习到关于全局特征的局部模式,从而更好地突出重要信息或减弱重复信息。

投影到Q、K、V中使用卷积滤波器是合理的,因为通常在创建这些投影时,序列中的每个项都是独立处理的。然而,这种处理方式忽略了任何有价值的局部信息。通过在这个阶段引入卷积滤波器,考虑了局部邻域,可以轻松克服这个问题。CvT在没有位置编码/嵌入的情况下表现更好的事实可能暗示了局部信息的重要性,并且这些信息足以保留任何与位置相关的信息。

在文中,跨步卷积仅针对K、V投影提出,并不适用于Q投影。这是因为在卷积输出体积中,相邻位置通常具有相似的信息。尽管同样的逻辑也适用于Q,但为什么没有这样做的原因尚不清楚。这可能是一个值得探索的有趣方向。

计算和内存成本

由于通过跨步卷积标记嵌入和跨步卷积投影减少了分辨率,因此在计算资源方面通常优于典型的ViTs。

比较

性能优于ViT,DeiT,PVT。

3.7 CoAtNet:将卷积和注意力结合到所有数据尺寸中

论文地址:https://arxiv.org/pdf/2106.04803.pdf
内在融合方法

这篇论文指出了变压器具有很高的模型容量(在训练数据上实现高准确率),但如果数据集大小较小,往往会出现过拟合的问题,而另一方面,CNN在泛化方面表现出色,即使在较小的数据集上也不会出现过拟合,但它们通常具有较低的模型容量。作者希望将卷积和注意力结合起来,以了解什么样的网络结构最适合创建既具有良好泛化性又具有小型和大型数据集的模型容量的模型。他们关注了两个关键领域:

系统集成卷积和注意力的方法
在以前的工作中,重点放在了一般卷积上,而在这篇论文中,作者展示了深度可分离卷积更适合被集成到注意力机制中。深度卷积操作可以数学表示为:

y i = ∑ j ∈ N ( i ) w i − j ⨀ x j y_{i} = \sum_{j\in N(i)} w_{i-j} \bigodot x_{j} yi=jN(i)wijxj

其中 ⨀ \bigodot 是元素级乘积(Hadamard乘积), y i y_i yi是像素 i i i处的 R C R^C RC输出, x i x_i xi是像素 j j j处的 R C R^C RC输入, N ( i ) N(i) N(i)是由卷积核定义的像素 i i i周围的局部邻域。由于这是深度卷积,输入具有 C C C个通道,

C ′ − k × k C'- k \times k Ck×k. 2维卷积滤波器。虽然这些是 C C C个单独的卷积滤波器,但我们可以将位于每个 C C C个滤波器的中心的相对位置的滤波器参数串联起来,以获得上述使用的 R C R^C RC维向量 w i − j w_{i-j} wij

另一方面,自注意力将具有以下表达式:

y j = ∑ j ∈ G ( i ) exp ⁡ ( x i T x j ) ∑ k ∈ G ( i ) exp ⁡ ( x i T x k ) ⏟ A i , j x j y_{j}=\sum_{j \in \mathcal{G}(i)} \underbrace{\frac{\exp (x_{i}^Tx_{j})}{\sum_{k\in \mathcal{G}(i)} \exp (x_{i}^Tx_{k})}}{A{i,j}} x{j} yj=jG(i) kG(i)exp(xiTxk)exp(xiTxj)Ai,jxj

i . e . y j = ∑ j ∈ G ( i ) A i , j x j i.e. \hspace{1cm} y_{j}=\sum_{j \in \mathcal{G}(i)} A_{i,j}x_{j} i.e.yj=jG(i)Ai,jxj

比较这两个方程,我们可以看到它们具有类似的形式,即都是对输入的加权平均,但它们有以下区别:

  1. w i − j w_{i-j} wij是本地的、静态的,并具有平移等价性
  2. A i , j A_{i,j} Ai,j是全局的、自适应的(随输入变化),并且没有平移等价性
    为了将这两者结合起来,作者建议在softmax归一化之前将注意力矩阵与全局静态卷积矩阵相加:

y j = ∑ j ∈ G ( i ) exp ⁡ ( x i T x j + w i − k ) ∑ k ∈ G ( i ) exp ⁡ ( x i T x k + w i − k ) ⏟ r e l A i , j x j y_{j}=\sum_{j \in \mathcal{G}(i)} \underbrace{\frac{\exp (x_{i}^Tx_{j} + w_{i-k})}{\sum_{k\in \mathcal{G}(i)} \exp (x_{i}^Tx_{k}+ w_{i-k})}}{relA{i,j}} x{j} yj=jG(i) kG(i)exp(xiTxk+wik)exp(xiTxj+wik)relAi,jxj

注意,这里的 w i − j w_{i-j} wij是标量 ( i . e . w i − j ∉ R C ) (i.e. w_{i-j}\notin R^C) (i.e.wij/RC)这样可以确保在训练过程中额外的成本最小!在 r e l A i , j relA_{i,j} relAi,j基于注意力的点积部分适应于输入并且没有平移等价性,而静态卷积核部分是静态的并且具有平移等价性,因此,根据这两者之间的相对大小,网络可以选择最佳平衡这两种偏差。

  1. 纯卷积层和混合层的最佳堆叠:

在设计了上述融合卷积到注意力机制的方法后,作者试验了在网络中堆叠这些混合注意力层的最佳方式。为了保持公平比较,在所有的实验中,他们设计了包含5个阶段 S 0 , S 1 , S 2 , S 3 , S 4 S_0,S_1,S_2,S_3,S_4 S0,S1,S2,S3,S4的网络,就像典型的CNN一样。每个阶段基本上可以由卷积层或带有相对注意力的变压器层组成(即融合了卷积偏差的注意力)。需要注意的是,在所有的实验中, S 0 S_0 S0都是卷积茎, S 1 S_1 S1也是卷积的,并且由MBConv与SE块组成。之所以不在这些阶段中使用注意力,是因为这些初始层具有很高的空间分辨率,实际上不可行应用注意力,因为它的二次复杂度。因此,作者尝试了以下配置:

  1. C-C-C-C-C
  2. C-C-C-C-T
  3. C-C-C-T-T
  4. C-C-T-T-T
  5. V i T R e l ViT_{Rel} ViTRel与上述设计的相对注意力具有相同的结构

为了评估哪种配置在整体上最好,作者关注了两个标准

泛化能力:在ImageNet 1k上,这是一个相对较小的数据集,过拟合总是一个问题,如果模型过拟合程度越高,则训练损失和验证指标之间的差距越大。直观地说,如果两个模型具有相同的训练损失,则验证指标更高的模型更好。基于这个标准,作者确定了以下排名:

C − C − C − C − C ≈ C − C − C − C − T ≥ C − C − C − T − T > C − C − T − T − T ≫ V i T R e l C-C-C-C-C ≈ C-C-C-C-T ≥ C-C-C-T-T > C-C-T-T-T ≫ ViT_{Rel} CCCCCCCCCTCCCTT>CCTTTViTRel

除了 V i T R e l ViT_{Rel} ViTRel的排名之外,所有其他模型的排名都是合理的。我们预期变压器层越多,模型的准确率就越高。因此,我们预期 V i T R e l ViT_{Rel} ViTRel具有最高的准确率,但事实似乎并非如此。作者假设 V i T R e l ViT_{Rel} ViTRel排名较低是因为它在初始阶段由于积极的步幅/缩小而丢失了局部信息。

还值得注意的是, C − C − T − T C-C-T-T CCTT C − T − T − C-T-T- CTT似乎具有相同的容量,这似乎表明仅增加变压器并不意味着更高的性能,模型容量会饱和。这也表明变压器更适合于后期阶段,而卷积更适合于较早期的阶段。

在进一步进行迁移学习实验(从JFT到ImagNet)后, C − C − C − T − T C-C-C-T-T CCCTT的表现优于 C − C − T − T − C-C-T-T- CCTT,因此他们建议 C − C − C − T − T C-C-C-T-T CCCTT作为整体最佳配置。

现在,让我们深入探讨一些关键问题和思考:

相对注意力是一个“软杠杆”

在以前的所有方法中,都有一种“硬杠杆”来结合卷积和注意力-即我们在CNN和注意力层之间有一个刚性组合。然而,在这种方法中,它是一个“软杠杆”-相对注意力本身具有静态全局卷积滤波器和全局自注意力,并且由网络来学习权重的相对大小,它可以决定是否给予卷积方面或注意力方面更高的权重。

计算和内存成本

V i T ViT ViT相比,计算和内存成本要低,并且与CNN相比要高一些。

比较

性能优于CvT

3.8 早期卷积帮助变换器更好地观察

论文地址:添加链接描述
外在融合方法

在改进视觉变换器(ViT)的优化能力方面,作者着眼于解决一些超参数变化引起的不稳定性问题,例如不同优化技术(AdamW vs SGD)之间的性能差异。虽然这似乎与合并卷积和注意力的主题无关,但作者提出的解决方案确实受益于对卷积和注意力学习偏差的理解。标准ViT使用了一种称为“拼接化的茎”的结构,其中包括一个步幅为 p p p p × p p \times p p×p卷积。在ViT中,通常选择 p = 16 p=16 p=16。这个步骤的目的是从输入图像中提取特征以供网络后续的变压器块使用。然而,发现标准ViT设置对于使用的优化器、超参数等非常敏感,优化能力较差。

拼接茎的特点是具有较大的滤波器大小和非常激进的步幅/降采样,与传统的卷积网络不同。这可能导致信息丢失,并且在网络的早期阶段产生瓶颈,尽管网络具有强大的表示能力,但由于丢失了信息,网络无法充分利用这些能力。作者假设拼接茎是标准ViT优化能力不佳的原因。

为了解决这个问题,作者提出了一种简单的修改:将拼接茎替换为由多个 3 × 3 3 \times 3 3×3、步幅2的卷积层组成的卷积茎。这些修改受到了传统卷积神经网络的启发。尽管这些修改似乎微不足道,但结果却是显著的: V i T C ViT_C ViTC(使用卷积茎)相较于原始的 V i T P ViT_P ViTP(使用拼接茎)具有更好的优化能力,包括更快的训练收敛速度、更好地与AdamW和SGD等优化器配合、对于关键超参数如学习率和权重衰减更稳定,以及在ImageNet数据集上取得了超过状态-of-the-art卷积神经网络的最佳性能。这些结果实证地表明,在ViT中使用卷积茎而不是拼接茎是一种有效的设计选择

在这段内容中,“卷积茎"是指一种由多个卷积层组成的结构,用于从输入图像中提取特征。具体来说,它由一系列 3 × 3 3 \times 3 3×3大小的卷积核组成,并且每个卷积核之间的步幅为2,这意味着在每一步中,卷积核都会在图像上以步长2的距离移动。这种结构类似于传统卷积神经网络中的卷积层,但具有更大的步幅,因此在较短的时间内捕获更大的感受野。通过使用卷积茎而不是原始的"拼接化的茎”,作者试图改善视觉变换器(ViT)的优化能力。

现在,让我们深入探讨一些关键问题和思考:

网络的茎部分本质上是一个预处理阶段,在这个阶段,图像输入被转换成适合被变压器块处理的形式。如果这个阶段的预处理是次优的或者丢失了关键信息,那么变压器块就会得到处理不好的输入,无法表现良好。

考虑到大步幅,很可能是激进的下采样和大的滤波器大小导致了信息的丢失,以及与使用卷积茎相比,嵌入的质量不佳,其中输入逐渐使用多个重叠的小局部窗口进行处理,以在多个尺度上聚合丰富的局部和分层特征,然后作为输入呈现给变压器阶段。卷积茎简单地能够学习到更好的嵌入,因此给变压器块的输入更好,因此整个网络的优化能力和性能更好!

简而言之,与“拼接化”的茎相比,使用卷积茎的变压器块的输入质量要好得多。

计算和内存成本
计算和内存成本与没有引入显著额外开销的ViT相似。

比较
性能优于ViT

3.9 Swin Transformer:使用移位窗口的分层视觉变换器

论文地址:https://arxiv.org/pdf/2103.14030.pdf
内在融合方法

Swin Transformer代表Shifted Window Transformer。在这篇论文中,作者试图将注意力和卷积结合起来,使得变压器在计算机视觉应用中的性能更好。他们建议修改典型的多头自注意力(MSA),使其具有全局感受野,变成具有局部感受野的Shifted Window多头自注意力(SW MSA),即注意力的窗口化版本。在论文中,他们建议使用大小为 M × M M \times M M×M的局部窗口,其中 M = 4 M=4 M=4。有四个关键细节:

这些窗口均为非重叠的
我们创建的窗口(每个窗口为 M × M M \times M M×M)是非重叠的,这是通过创建一个均匀网格来实现的,其中每个网格单元是 M × M M \times M M×M的窗口。(您也可以将其视为带有步幅 M M M M × M M \times M M×M滑动窗口,因此窗口之间没有重叠)注意力的复杂度与图像大小成线性关系自注意力在每个窗口内单独应用。因此,注意力的复杂度与 M 2 M^2 M2 ×(窗口数量)成正比,但窗口数量为 H M × W M \frac{H}{M} \times \frac{W}{M} MH×MW ,这意味着注意力的复杂度与输入图像的大小成线性关系。由于局部注意力和窗口之间没有重叠,这种线性复杂度得以实现。

各个深度的补丁/窗口在各层级处被“合并”(经过降采样)以学习分层特征
整个架构由多个阶段组成,每个阶段中都有多个变压器块。在每个阶段的开头,有一个补丁合并层,该层接收来自上一层的
H × W × C H\times W\times C H×W×C输入,并在本地应用线性层,将输入中的每个类似于网格的 2 × 2 × C 2 \times 2 \times C 2×2×C空间补丁转换 1 × 1 × 2 C 1 \times 1 \times 2C 1×1×2C的空间体积,即将 H × W × C H\times W\times C H×W×C的体积转换为 H 2 ×   W 2 × 2 C \frac{H}{2}\times\ \frac{W}{2}\times2C 2H× 2W×2C,即补丁合并层的功能类似于最大池化。因此,在此操作之后,每个新的 M × M M \times M M×M补丁现在包含来自前一阶段的4个相邻的 M × M M \times M M×M补丁的信息。这有助于网络学习分层信息。

连续的变压器块(在每个阶段内)具有Shifted Window分区
由于基于窗口的注意力机制在每个窗口内是局部的,并且在不同窗口之间没有连接,因此这可能会限制表示能力。因此,为了克服这一限制,作者提出了一种交替配置连续变压器块的Shifted Window分区系统。一种配置是默认的网格配置,而另一种配置是默认配置向右和向下偏移
( M 2 , M 2 \frac{M}{2},\frac{M}{2} 2M,2M)个像素。在架构中交替的变压器块具有交替的配置!

请注意,他们使用的注意力机制是相对注意力的一种变体。

现在,让我们深入探讨一些关键问题和思考:

Swin Transformer本质上与CNN非常相似,它的结构类似于具 M × M M \times M M×M卷积核和步幅 M M M的CNN,但主要区别在于,CNN滤波器的权重是静态的,而这里的权重全部都是根据输入图像动态调整的(注意力机制)。网络中每个阶段之间的补丁合并功能类似于最大池化层。

计算和内存成本

与常规的ViT相比,它效率更高,但与CNN略有差异

比较

比ViT,DeiT表现更好

3.10 MOAT:交替移动卷积和注意力带来强大的视觉模型

在这里插入图片描述

论文地址:https://arxiv.org/pdf/2210.01820.pdf
内在与外在相融合的方法

这篇论文采用了CoatNet论文中提出的相对注意力机制,但除此之外,它还打包了一个移动卷积层,二者共同构成了MOAT块。MOAT块的设计灵感来自MobileNet中的MBConv块和Transformer块。值得注意的是,MBConv块和Transformer块都具有反向瓶颈组件和注意力组件。在较高层次上,MOAT块是通过将MBConv块的SE注意力模块替换为Transformer块的自注意力来设计的。此外,当应用程序需要更大分辨率的输入图像时,相对自注意力可以无缝转换为非重叠的局部相对自注意力(类似于SWIN Transformer)。此外,在MOAT块的情况下,MOAT块内的移动卷积有效地捕获了来自注意力阶段的非重叠窗口之间的任何有用关系。因此,它不需要使用单独的移动窗口机制,并且在目标检测和语义分割等任务上比SWIN Transformer表现更好。

MOATNet是通过堆叠一个卷积起始层,2个阶段的移动卷积层,然后是2个MOAT块来获得的。这个结构受到了CoAtNet的启发,并被发现是最有效的。作者尝试了各种配置(即上述5个阶段中每个阶段内块的数量,以及每个块内的通道数)

现在,让我们深入探讨一些关键问题和思考:

交替使用卷积和注意力层是有益的!
MOAT本质上是CoAt的扩展,新添加的是与注意力层交替的移动卷积层。MOAT仅通过这个建议就取得了更好的性能,这在直觉上是有意义的,因为现在网络本质上是在全局特征上交替关注,然后关注这些全局特征的局部关系,然后关注这些局部关系之间的全局关系,依此类推。如果将整个阶段视为一个组合操作,那么由Transformer块组成的阶段与由交替卷积和Transformer组成的阶段进行比较,即Transformer之间由卷积分隔,直觉上,交替卷积和Transformer的阶段具有更强的学习偏差,这驱使网络学习到有用的模式,尽管其表现能力较弱。因此,更强的学习偏差有助于学习最佳模式,而不会过度拟合。

计算和内存成本

比ViTs更好(MOAT有多种配置,因此可以根据计算限制进行扩展或缩减,请参阅论文以获取详细信息)

比较

优于CoAtNet和SWIN Transformer

4. 结论

在本文中,我们已经看到了各种方法,可以将卷积和注意力的学习偏差结合起来。请注意,所有论文报告的结果都是基于公开数据集的。当涉及到你的研究时,最好的方法可能高度依赖于你的数据集,因此尝试多种方法可能是个好主意。

希望我能够向你们简要介绍这些论文,以便你们能够决定进一步探索哪些方法。如果你有时间,我强烈建议阅读所有这些论文(我提供了arxiv链接)!

如果你必须选择一种方法,我会建议从MOAT开始,因为它在本文中与所有其他方法相比具有最佳性能,并且可以根据计算预算约束进行扩展或缩减。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/524738
推荐阅读
相关标签
  

闽ICP备14008679号