ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【caffe】关于gempool层

2021-10-24 09:02:30  阅读:243  来源: 互联网

标签:__ power gempool self pooling caffe 关于 output size


近期由于又重新接触到pytorch转caffe的相关任务(gempool)。发现BN并不是caffe底层代码就已经写了一个BN的实现,而是在prototxt用一些不同的算子组合成BN层。

这一点仿佛为我打开了新世界的大门,觉得还挺神奇的,所以先写一篇来看看gempool公式,并进行对应的prototxt的实现吧。加深一下理解。

1.分析

Generalized Mean Pooling Explained | Papers With Codeicon-default.png?t=L9C2https://paperswithcode.com/method/generalized-mean-pooling看下面的公式,可能会云里雾里,但是会发现有相同的参数p,一个时power(p),一个是power(1/p)。

对应的代码(https://github.com/JDAI-CV/fast-reid/blob/master/fastreid/layers/pooling.py#L50),上面公式的代码表示:

class GeneralizedMeanPooling(nn.Module):
    r"""Applies a 2D power-average adaptive pooling over an input signal composed of several input planes.
    The function computed is: :math:`f(X) = pow(sum(pow(X, p)), 1/p)`
        - At p = infinity, one gets Max Pooling
        - At p = 1, one gets Average Pooling
    The output is of size H x W, for any input size.
    The number of output features is equal to the number of input planes.
    Args:
        output_size: the target output size of the image of the form H x W.
                     Can be a tuple (H, W) or a single H for a square image H x H
                     H and W can be either a ``int``, or ``None`` which means the size will
                     be the same as that of the input.
    """

    def __init__(self, norm=3, output_size=(1, 1), eps=1e-6, *args, **kwargs):
        super(GeneralizedMeanPooling, self).__init__()
        assert norm > 0
        self.p = float(norm)
        self.output_size = output_size
        self.eps = eps

    def forward(self, x):
        x = x.clamp(min=self.eps).pow(self.p)
        return F.adaptive_avg_pool2d(x, self.output_size).pow(1. / self.p)

    def __repr__(self):
        return self.__class__.__name__ + '(' \
               + str(self.p) + ', ' \
               + 'output_size=' + str(self.output_size) + ')'

2.实现

由上面知道基本是两个power与一个avgpool夹心饼干的组合。得到一个gempool。如果是固定参数的话,就计算好就行了,分数部分需要修改为小数。

那以上面的代码为例,p=3,则1/p≈0.3334。

layer {
  name: "gem_power1"
  type: "Power"
  bottom: "relu_blob1"
  top: "power_blob1"
  power_param {
    power: 2
    scale: 1
    shift: 0
  }
}
layer {
    name: "avgpool1"
    type: "Pooling"
    bottom: "power_blob1"
    top: "avgpool_blob1"
    pooling_param {
        pool: AVE
        global_pooling: true
    }
}
layer {
  name: "gem_power2"
  type: "Power"
  bottom: "avgpool_blob1"
  top: "power_blob2"
  power_param {
    power: 0.3334
    scale: 1
    shift: 0
  }
}

标签:__,power,gempool,self,pooling,caffe,关于,output,size
来源: https://blog.csdn.net/qq_35975447/article/details/120787868

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有