Tensorflow 中的分数最大池化

Ewe*_*ler 4 machine-learning tensorflow

tf.nn.fractional_max_pool在 Tensorflow 中使用该函数时,除了它返回的输出池化张量外,它还返回 arow_pooling_sequence和 a col_pooling_sequence,我假设它们用于反向传播以查找其梯度。这与正常的 $2 \times 2$ 最大池化形成对比,后者仅返回池化张量。

我的问题是:我们是否必须自己处理 row_pooling 和 col_pooling 值?我们如何将它们包含到网络中以使反向传播正常工作?我修改了一个简单的卷积神经网络,使用分数最大池化而不是 2 x 2 最大池化而不使用这些值,结果要差得多,这让我相信我们必须明确处理这些。

这是我使用 FMP 的代码的相关部分:

def add_layer_ops_FMP(conv_func, x_input, W, keep_prob_layer, training_phase):

    h_conv = conv_func(x_input, W, stride_l = 1)
    h_BN = batch_norm(h_conv, training_phase, epsilon)
    h_elu = tf.nn.elu(h_BN) # Rectified unit layer - change accordingly

    def dropout_no_training(h_elu=h_elu):
        return dropout_op(h_elu, keep_prob = 1.0)

    def dropout_in_training(h_elu=h_elu, keep_prob_layer=keep_prob_layer):
        return dropout_op(h_elu, keep_prob = keep_prob_layer)

    h_drop = tf.cond(training_phase, dropout_in_training, dropout_no_training)
    h_pool, row_pooling_sequence, col_pooling_sequence = tf.nn.fractional_max_pool(h_drop) # FMP layer. See Ben Graham's paper 

    return h_pool
Run Code Online (Sandbox Code Playgroud)

链接到 github 上的函数。

Zho*_*ang 6

  1. 我们需要处理row_pooling_sequencecol_pooling_sequence吗?

即使tf.nn.fractional_max_pool文件说,事实证明这是需要计算梯度2张额外的张量,相信大家并不需要特别处理这2张额外的张量,并将它们添加到梯度计算操作。tf.nn.fractional_max_poolTensorFlow 中的反向传播已经被_FractionalMaxPoolGrad函数注册到梯度计算流程中。正如您在 中所见_FractionalMaxPoolGradrow_pooling_sequencecol_pooling_sequenceop.outputs[1]和提取op.outputs[2]并用于计算梯度。

@ops.RegisterGradient("FractionalMaxPool")
def _FractionalMaxPoolGrad(op, grad_0, unused_grad_1, unused_grad_2):
  """..."""
  return gen_nn_ops._fractional_max_pool_grad(op.inputs[0], op.outputs[0],
                                              grad_0, op.outputs[1],
                                              op.outputs[2],
                                              op.get_attr("overlapping"))
Run Code Online (Sandbox Code Playgroud)
  1. 使用后性能较差的可能原因fractional_max_pool(在我个人看来)。

分数最大池化论文中,作者在空间稀疏的卷积网络中使用了分数最大池化。根据他的空间稀疏卷积网络设计,他实际上通过填充零来扩展图像输入空间大小。此外,分数最大池化将输入缩小了一个pooling_ratio通常小于 2的因子。这两个结合在一起允许堆叠比使用常规最大池化更多的卷积层,从而构建更深的网络。(即想象使用 CIFAR-10 数据集,(非填充)输入空间大小为 32x32,空间大小在 3 个卷积层和 3 个最大池化操作后下降到 4x4。如果使用分数最大池化pooling_ratio=1.4,空间大小在 6 个卷积层和 6 个分数最大池化层后下降到 4x4)。我尝试pooling_ratio=1.47在 MNIST 数据集上构建具有 2-conv-layer+2-pooling-layer(常规最大池 vs. 分数最大池)+2-fully-connected-layer 的 CNN。使用常规最大池化的方法也比使用分数最大池化的方法产生了更好的性能(性能下降了 15~20%)。比较馈入全连接层之前的空间大小,常规最大池化模型的空间大小为 7x7,分数最大池化模型的空间大小为 12x12。在后一个模型中再添加一个 conv+fractional_max_pool(最终空间大小降为 8x8)将性能提高到与前一个模型具有常规最大池化的比较水平。

总之,我个人认为分数最大池化论文中的良好性能是通过将空间稀疏 CNN 与分数最大池化和小过滤器(以及网络中的网络)结合使用来实现的,即使在输入图像空间大小很小。因此,在常规 CNN 网络中,简单地用分数最大池化替换常规最大池化并不一定会给您带来更好的性能。