当在Tensorflow中使用函数tf.nn.fractional_max_pool时,除了返回的输出合并张量外,它还返回一个row_pooling_sequence和一个col_pooling_sequence,我假定它们在反向传播中用于查找其梯度。这与普通的$ 2 \ times 2 $ max池相反,后者只返回池化的张量。

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

最佳答案

我们需要处理row_pooling_sequencecol_pooling_sequence吗?


即使tf.nn.fractional_max_pool documentation表示它会变成计算梯度所需的2个额外张量,但我相信我们无需专门处理这2个额外张量并将它们添加到梯度计算操作中。 tf.nn.fractional_max_pool function已将TensorFlow中_FractionalMaxPoolGrad的反向传播注册到梯度计算流程中。如您在_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"))



使用fractional_max_pool后性能较差的可能原因(我个人认为)。


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个转换层+ 2个合并层(常规最大池与带pooling_ratio=1.47的分数最大池)+2个完全连接层的CNN。使用常规最大池的计算机也比使用分数最大池的计算机产生更好的性能(降低15%至20%的性能)。在馈入完全连接的层之前比较空间大小,具有规则最大池的模型的空间大小为7x7,具有分数最大池的模型的空间大小为12x12。与后者模型(最终空间大小降至8x8)再增加一个conv + fractional_max_pool相比,具有常规最大池化的前者模型将性能提高到了更高的比较水平。

总而言之,我个人认为,通过结合使用空间稀疏的CNN和分数最大池和小型过滤器(以及网络中的网络)相结合,可以实现分数最大池中的良好性能,即使在输入图像的空间很小。因此,在常规的CNN网络中,仅用分数最大池替换常规最大池并不一定会带来更好的性能。

08-25 07:40