Tensorflow中的分数最大池

时间:2016-10-06 02:47:21

标签: machine-learning tensorflow

在Tensorflow中使用函数tf.nn.fractional_max_pool时,除了它返回的输出池化张量之外,它还返回row_pooling_sequencecol_pooling_sequence,我认为它在反向传播中使用找到渐变的。这与正常的$ 2 \ times 2 $ max pooling相反,后者只返回合并的张量。

我的问题是:我们是否必须自己处理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

Link to function on github.

1 个答案:

答案 0 :(得分:4)

  1. 我们需要处理row_pooling_sequencecol_pooling_sequence吗?
  2. 即使tf.nn.fractional_max_pool documentation说它变成了计算渐变所需的2个额外张量,我相信我们需要专门处理这2个额外张量并将它们添加到渐变计算中操作。 TensorFlow中tf.nn.fractional_max_pool的反向传播已经由_FractionalMaxPoolGrad function注册到梯度计算流程中。正如您在_FractionalMaxPoolGrad中看到的那样,row_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"))
    
    1. 使用fractional_max_pool(我个人意见)后表现较差的可能原因。
    2. fractional max pooling paper中,作者在spatially-sparse convolutional network中使用了小数最大合并。根据他的空间稀疏卷积网络设计,他实际上通过填充零来扩展图像输入空间大小。此外,分数最大池将输入缩小了pooling_ratio因子,通常小于2.这两个组合在一起允许堆叠比使用常规最大池更多的卷积层,从而构建更深的网络。 (即想象使用CIFAR-10数据集,(非填充)输入空间大小为32x32,空间大小在3个卷积层和3个最大池操作后降至4x4。如果使用小数最大池与pooling_ratio=1.4,空间大小在6个卷积和6个分数最大合并层之后下降到4x4)。我尝试在MNIST数据集上构建具有2-conv-layer + 2-pooling-layer(常规最大池与最小分数池pooling_ratio=1.47)+ 2-full-connected-layer的CNN。使用常规最大池的那个也比使用分数最大池的性能更好(性能下降15~20%)。比较进入完全连通层之前的空间大小,具有常规最大池的模型具有7x7的空间大小,具有分数最大池的模型具有12x12的空间大小。在后一个模型中添加一个conv + fractional_max_pool(最终空间大小降至8x8),将性能提高到与具有常规最大池的前一个模型更具比较性的水平。

      总之,我个人认为通过结合使用空间稀疏的CNN与分数最大池和小型过滤器(以及网络中的网络)来实现分数最大池文件的良好性能,从而构建深层网络即使输入图像的空间尺寸很小。因此,在常规CNN网络中,简单地用常规最大池替换常规最大池并不一定能为您提供更好的性能。