什么是卷积神经网络中的"linear projection"
What is "linear projection" in convolutional neural network
我正在通读 Residual learning,我有一个问题。
3.2中提到的“线性投影”是什么?明白了这个看起来很简单,但无法理解......
有人可以提供简单的例子吗?
线性投影是一种线性投影,其中每个新特征都是原始特征的简单加权和。如论文中所述,这可以用矩阵乘法表示。如果 x
是 N
输入特征的向量并且 W
是 M
-byN
矩阵,则矩阵乘积 Wx
产生 M
新特征,其中每个特征都是 x
的线性投影。 W
的每一行是一组权重,定义了 M
线性投影之一(即,W
的每一行包含 x
).
首先,重要的是要了解 x
、y
和 F
是什么以及为什么它们需要任何投影。我会尝试用简单的术语进行解释,但需要对 ConvNets 有基本的了解。
x
是该层的输入数据(称为 tensor),在 ConvNets 的情况下,它的秩为 4。你可以将其视为 4-dimensional array。 F
通常是一个conv层(本文中是conv+relu+batchnorm
),而y
将两者结合在一起(形成输出通道)。 F
的结果也是 4 阶,除一维外,大部分维度与 x
相同。这正是转换应该修补的内容。
例如,x
形状可能是 (64, 32, 32, 3)
,其中 64 是批量大小,32x32 是图像大小,3 代表 (R, G, B) 颜色通道。 F(x)
可能是 (64, 32, 32, 16)
:批量大小永远不会改变,为简单起见,ResNet conv-layer 也不会改变图像大小,但可能会使用不同数量的过滤器 - 16.
因此,为了使 y=F(x)+x
成为有效操作,x
必须是 "reshaped" 从 (64, 32, 32, 3)
到 (64, 32, 32, 16)
。
我想在这里强调,"reshaping"不是numpy.reshape
所做的。
相反,x[3]
填充了 13 个零,如下所示:
pad(x=[1, 2, 3],padding=[7, 6]) = [0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0]
仔细想想,这是一个3维向量在16维上的投影。换句话说,我们开始认为我们的向量是相同的,但那里还有 13 个维度。 None 的其他 x
个维度已更改。
这是执行此操作的 Tensorflow 中的代码 the link。
在 Pytorch 中(特别是 torchvision\models\resnet.py),在瓶颈结束时,您将有两种情况
输入向量 x 的通道,比如 x_c(不是空间分辨率,而是通道),小于等于瓶颈层 conv3 之后的输出,比如 d 维。这可以通过 1 乘 1 卷积来缓解,在平面 = x_c 和 out_planes = d 中,步幅为 1,然后进行批量归一化,然后假设添加 F(x) + x 发生x 和 F(x) 具有相同的空间分辨率。
x的空间分辨率和它的通道数都与BottleNeck层的输出不匹配,在这种情况下,上面提到的1×1卷积需要步幅为2才能空间分辨率和通道数以匹配逐元素加法(同样在加法之前对 x 进行批量归一化)。
我正在通读 Residual learning,我有一个问题。 3.2中提到的“线性投影”是什么?明白了这个看起来很简单,但无法理解......
有人可以提供简单的例子吗?
线性投影是一种线性投影,其中每个新特征都是原始特征的简单加权和。如论文中所述,这可以用矩阵乘法表示。如果 x
是 N
输入特征的向量并且 W
是 M
-byN
矩阵,则矩阵乘积 Wx
产生 M
新特征,其中每个特征都是 x
的线性投影。 W
的每一行是一组权重,定义了 M
线性投影之一(即,W
的每一行包含 x
).
首先,重要的是要了解 x
、y
和 F
是什么以及为什么它们需要任何投影。我会尝试用简单的术语进行解释,但需要对 ConvNets 有基本的了解。
x
是该层的输入数据(称为 tensor),在 ConvNets 的情况下,它的秩为 4。你可以将其视为 4-dimensional array。 F
通常是一个conv层(本文中是conv+relu+batchnorm
),而y
将两者结合在一起(形成输出通道)。 F
的结果也是 4 阶,除一维外,大部分维度与 x
相同。这正是转换应该修补的内容。
例如,x
形状可能是 (64, 32, 32, 3)
,其中 64 是批量大小,32x32 是图像大小,3 代表 (R, G, B) 颜色通道。 F(x)
可能是 (64, 32, 32, 16)
:批量大小永远不会改变,为简单起见,ResNet conv-layer 也不会改变图像大小,但可能会使用不同数量的过滤器 - 16.
因此,为了使 y=F(x)+x
成为有效操作,x
必须是 "reshaped" 从 (64, 32, 32, 3)
到 (64, 32, 32, 16)
。
我想在这里强调,"reshaping"不是numpy.reshape
所做的。
相反,x[3]
填充了 13 个零,如下所示:
pad(x=[1, 2, 3],padding=[7, 6]) = [0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0]
仔细想想,这是一个3维向量在16维上的投影。换句话说,我们开始认为我们的向量是相同的,但那里还有 13 个维度。 None 的其他 x
个维度已更改。
这是执行此操作的 Tensorflow 中的代码 the link。
在 Pytorch 中(特别是 torchvision\models\resnet.py),在瓶颈结束时,您将有两种情况
输入向量 x 的通道,比如 x_c(不是空间分辨率,而是通道),小于等于瓶颈层 conv3 之后的输出,比如 d 维。这可以通过 1 乘 1 卷积来缓解,在平面 = x_c 和 out_planes = d 中,步幅为 1,然后进行批量归一化,然后假设添加 F(x) + x 发生x 和 F(x) 具有相同的空间分辨率。
x的空间分辨率和它的通道数都与BottleNeck层的输出不匹配,在这种情况下,上面提到的1×1卷积需要步幅为2才能空间分辨率和通道数以匹配逐元素加法(同样在加法之前对 x 进行批量归一化)。