deform_conv2d

paddle.stastic.nn.deform_conv2d ( x, offset, mask, num_filters, filter_size, stride\=1, padding\=0, dilation\=1, groups\=1, deformable_groups\=1, im2col_step\=1, weight_attr\=None, bias_attr\=None, name\=None )

可变形卷积算子

deform_conv2d op对输入4-D Tensor计算2-D可变形卷积。给定输入Tensor x,输出Tensor y,可变形卷积运算如下所示:

可形变卷积v2:

deform_conv2d - 图1

可形变卷积v1:

deform_conv2d - 图2

其中

deform_conv2d - 图3

deform_conv2d - 图4

分别为第k个位置的可学习偏移和调制标量。在deform_conv2d_v1中

deform_conv2d - 图5

为1.

具体细节可以参考论文:<<Deformable ConvNets v2: More Deformable, Better Results>><<Deformable Convolutional Networks>>

示例

输入:

input 形状:

deform_conv2d - 图6

卷积核形状:

deform_conv2d - 图7

offset 形状: (N,2∗deformable_groups∗Hf∗Hw,Hin,Win)(N,2∗deformable_groups∗Hf∗Hw,Hin,Win)

mask 形状: (N,deformable_groups∗Hf∗Hw,Hin,Win)(N,deformable_groups∗Hf∗Hw,Hin,Win)

输出:

输出形状: (N,Cout,Hout,Wout)(N,Cout,Hout,Wout)

其中

HoutWout\=(Hin+2∗paddings[0]−(dilations[0]∗(Hf−1)+1))strides[0]+1\=(Win+2∗paddings[1]−(dilations[1]∗(Wf−1)+1))strides[1]+1Hout\=(Hin+2∗paddings[0]−(dilations[0]∗(Hf−1)+1))strides[0]+1Wout\=(Win+2∗paddings[1]−(dilations[1]∗(Wf−1)+1))strides[1]+1

参数:

  • x (Tensor) - 形状为 [N,C,H,W][N,C,H,W] 的输入Tensor,数据类型为float32或float64。

  • offset (Tensor) – 可变形卷积层的输入坐标偏移,数据类型为float32或float64。

  • mask (Tensor, 可选) – 可变形卷积层的输入掩码,当使用可变形卷积算子v1时,请将mask设置为None, 数据类型为float32或float64。

  • num_filters (int) – 卷积核数,与输出Tensor通道数相同。

  • filter_size (int|tuple) – 卷积核大小。如果filter_size为元组,则必须包含两个整数(filter_size_H, filter_size_W)。若数据类型为int,卷积核形状为(filter_size, filter_size)。

  • stride (int|tuple, 可选) – 步长大小。如果stride为元组,则必须包含两个整数(stride_H, stride_W)。否则stride_H = stride_W = stride。默认值为1。

  • padding (int|tuple, 可选) – padding大小。如果padding为元组,则必须包含两个整数(padding_H, padding_W)。否则padding_H = padding_W = padding。默认值为0。

  • dilation (int|tuple, 可选) – dilation大小。如果dilation为元组,则必须包含两个整数(dilation_H, dilation_W)。否则dilation_H = dilation_W = dilation。默认值为1。

  • groups (int, 可选) – 卷积组数。依据Alex Krizhevsky的Deep CNN论文中的分组卷积,有:当group=2时,前一半卷积核只和前一半输入通道有关,而后一半卷积核只和后一半输入通道有关。默认值为1。

  • deformable_groups (int, 可选) – 可变形卷积组数。默认值为1。

  • im2col_step (int, 可选) – 每个im2col计算的最大图像数。总batch大小应可以被该值整除或小于该值。如果您面临内存问题,可以尝试在此处使用一个较小的值。默认值为1。

  • weight_attr (ParamAttr,可选) – 可变形卷积的可学习权重的属性。如果将其设置为None或某种ParamAttr,可变形卷积将创建ParamAttr作为weight_attr。如果没有设置此weight_attr的Initializer,该参数将被Normal(0.0, std)初始化,且其中的std为 (2.0filter_elem_num)0.5(2.0filter_elem_num)0.5 。默认值为None。

  • bias_attr (ParamAttr|bool,可选) – 可变形卷积层的偏置的参数属性。如果设为False,则输出单元不会加偏置。如果设为None或者某种ParamAttr,conv2d会创建ParamAttr作为bias_attr。如果不设置bias_attr的Initializer,偏置会被初始化为0。默认值为None。

  • name (str,可选) – 具体用法请参见 Name ,一般无需设置,默认值为None。

返回:Tensor, 可变形卷积输出的4-D Tensor,数据类型为float32或float64。

抛出异常:ValueError – 如果input, filter_size, stride, padding和groups的大小不匹配。

代码示例

  1. #deformable conv v2:
  2. import paddle
  3. paddle.enable_static()
  4. C_in, H_in, W_in = 3, 32, 32
  5. filter_size, deformable_groups = 3, 1
  6. data = paddle.static.data(name='data', shape=[None, C_in, H_in, W_in], dtype='float32')
  7. offset = paddle.static.data(name='offset', shape=[None, 2*deformable_groups*filter_size**2, H_in, W_in], dtype='float32')
  8. mask = paddle.static.data(name='mask', shape=[None, deformable_groups*filter_size**2, H_in, W_in], dtype='float32')
  9. out = paddle.static.nn.deform_conv2d(x=data, offset=offset, mask=mask,
  10. num_filters=2, filter_size=filter_size, padding=1)
  11. #deformable conv v1:
  12. import paddle
  13. paddle.enable_static()
  14. C_in, H_in, W_in = 3, 32, 32
  15. filter_size, deformable_groups = 3, 1
  16. data = paddle.static.data(name='data', shape=[None, C_in, H_in, W_in], dtype='float32')
  17. offset = paddle.static.data(name='offset', shape=[None, 2*deformable_groups*filter_size**2, H_in, W_in], dtype='float32')
  18. out = paddle.static.nn.deform_conv2d(x=data, offset=offset, mask=None,
  19. num_filters=2, filter_size=filter_size, padding=1)