我正在阅读Residual learning,我有一个问题。什么是3.2中提到的“线性投影”?一旦得到这个看起来很简单,但无法理解......
我基本上不是计算机科学人,所以如果有人提供一个简单的例子,我将不胜感激。
我正在阅读Residual learning,我有一个问题。什么是3.2中提到的“线性投影”?一旦得到这个看起来很简单,但无法理解......
我基本上不是计算机科学人,所以如果有人提供一个简单的例子,我将不胜感激。
首先,重要的是要了解什么x
、是什么y
以及F
为什么它们需要任何投影。我将尝试用简单的术语来解释,但需要对ConvNets有基本的了解。
x
是层的输入数据(称为张量),在 ConvNets 的情况下,它的等级为 4。您可以将其视为4 维数组。F
通常是一个卷积层(conv+relu+batchnorm
在本文中),并将y
两者结合在一起(形成输出通道)。的结果F
也是第 4 级,除了 1 之外,大多数维度将与 中的相同x
。这正是转换应该修补的内容。
例如,x
形状可能是(64, 32, 32, 3)
,其中 64 是批量大小,32x32 是图像大小,3 代表 (R, G, B) 颜色通道。F(x)
可能是(64, 32, 32, 16)
:批量大小永远不会改变,为简单起见,ResNet 卷积层也不会改变图像大小,但可能会使用不同数量的过滤器 - 16。
因此,为了y=F(x)+x
成为有效的操作,x
必须从(64, 32, 32, 3)
to进行“重塑” (64, 32, 32, 16)
。
我想在这里强调的是,这里的“重塑”不是什么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 个维度。其他x
维度均未更改。
这是Tensorflow 中执行此操作的代码的链接。
线性投影是每个新特征都是原始特征的简单加权和。如论文中所述,这可以用矩阵乘法来表示。如果x
是N
输入特征的向量并且W
是M
-byN
矩阵,则矩阵乘积Wx
产生M
新特征,其中每个特征都是 的线性投影x
。的每一行W
是一组权重,定义了一个M
线性投影(即,每一行W
包含 的一个加权和的系数x
)。
在 Pytorch(特别是 torchvision\models\resnet.py)中,在瓶颈结束时,您将有两种情况
输入向量 x 的通道,比如 x_c(不是空间分辨率,而是通道),小于等于 Bottleneck 层 conv3 之后的输出,比如 d 维。然后可以通过 1 x 1 卷积来缓解这种情况,其中 in planes = x_c 和 out_planes = d,步幅为 1,然后进行批量归一化,然后假设 x 和 F(x) 具有相同的空间分辨率。
x 的空间分辨率及其通道数都与 BottleNeck 层的输出不匹配,在这种情况下,上面提到的 1×1 卷积需要步长 2 才能使空间分辨率和通道数都达到匹配元素加法(在加法之前再次对 x 进行批量标准化)。