【发布时间】:2018-02-17 15:55:51
【问题描述】:
我正在阅读Residual learning,我有一个问题。 什么是3.2中提到的“线性投影”?得到这个之后看起来很简单,但无法理解......
我基本上不是计算机科学的人,所以如果有人能给我一个简单的例子,我将不胜感激。
【问题讨论】:
标签: machine-learning neural-network projection deep-residual-networks
我正在阅读Residual learning,我有一个问题。 什么是3.2中提到的“线性投影”?得到这个之后看起来很简单,但无法理解......
我基本上不是计算机科学的人,所以如果有人能给我一个简单的例子,我将不胜感激。
【问题讨论】:
标签: machine-learning neural-network projection deep-residual-networks
在 Pytorch(特别是 torchvision\models\resnet.py)中,在瓶颈结束时,您将有两种情况
输入向量 x 的通道,比如 x_c(不是空间分辨率,而是通道),小于等于瓶颈层 conv3 之后的输出,比如 d 维度。然后可以通过 1 x 1 卷积来缓解这种情况,其中 in planes = x_c 和 out_planes = d,步幅为 1,然后进行批量归一化,然后假设 x 和 F(x) 具有相同的空间分辨率。
x 的空间分辨率和它的通道数都与 BottleNeck 层的输出不匹配,在这种情况下,上面提到的 1×1 卷积需要步长 2 才能获得空间分辨率和数量与元素相加相匹配的通道数(同样在相加之前对 x 进行批量标准化)。
【讨论】:
首先,重要的是要了解x、y 和F 是什么以及它们为什么需要任何投影。我会尽量简单解释,但需要对ConvNets有基本的了解。
x 是层的输入数据(称为 tensor),在 ConvNets 的情况下,它的等级是 4。你可以将其视为 4-dimensional array。 F 通常是一个卷积层(本文中为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 卷积层也不会改变图像大小,但可能会使用不同数量的过滤器 - 16。
因此,为了使y=F(x)+x 成为有效操作,必须将x 从(64, 32, 32, 3)“重塑”为(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 中执行此操作的代码的 the link。
【讨论】:
strides=2),x也以相同的步幅通过一个池化层。所以F(x) 和x 都将图像的大小缩小了一半,就像之前一样,只需要投影“通道”维度。我只能在python中找到一个例子:github.com/tflearn/tflearn/blob/master/examples/images/…你可以看到downsample=True的两个图层,这两个图层都缩小了图像。
线性投影是每个新特征都是原始特征的简单加权和。如论文中所述,这可以用矩阵乘法来表示。如果x 是N 输入特征的向量并且W 是M-byN 矩阵,则矩阵乘积Wx 产生M 新特征,其中每个特征都是x。 W 的每一行是一组权重,定义了 M 线性投影之一(即,W 的每一行包含x 的加权和之一的系数)。
【讨论】: