我在深度网络中使用 1x1 卷积来减少特征 x:Bx2CxHxW
到 BxCxHxW
。我有三个选择:
- x -> Conv (1x1) -> Batchnorm-->ReLU。代码将为
output = ReLU(BN(Conv(x)))
。引用resnet - x -> BN -> ReLU-> 转换。因此代码将是
output = Conv(ReLU(BN(x)))
。引用densenet - x-> 转化次数代码为
output = Conv(x)
哪一个最常用于特征缩减?为什么?
最佳答案
由于您要端到端地训练网络,因此无论您使用什么配置 - 权重都会经过训练以适应它们。
BatchNorm?
我想您需要问自己的第一个问题是您想使用 BatchNorm 吗?如果你的网很深并且你关心covariate shifts那么你可能应该有一个 BatchNorm - 这里是选项 no。 3
首先进行 BatchNorm?
如果您的x
是另一个conv
层的输出,那么您的第一个和第二个选择之间实际上没有区别:您的网络是...-的级联conv
-bn
-ReLU
-conv
-BN
-ReLU
-conv
-...所以它只是将网络“人工”划分为函数conv
、bn
、relu的三元组
直到第一个和最后一个函数,您都可以按照自己的意愿进行拆分。此外,由于 Batchnorm 是一种线性运算(缩放 + 偏差),因此可以将其“折叠”到相邻的 conv 层中,而无需更改网络,因此基本上只剩下 conv 了。 -relu
对。
因此,您突出显示的前两个选项之间并没有太大区别。
还有什么要考虑的?
更改特征维度时真的需要 ReLU 吗?您可以将降维视为线性映射 - 将到x
映射的权重分解为一个较低的秩矩阵,最终映射到c
维空间而不是 2c
空间。如果您考虑线性映射,那么您可能会完全省略 ReLU
。
请参阅fast RCNN SVD trick举个例子。
关于tensorflow - 用于特征缩减的 Conv 1x1 配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53919836/