Col2Im

贡献说明

贡献者 贡献方 贡献算子 贡献时间 贡献内容
Qiu Zhuang 哈尔滨工业大学-苏统华团队 Col2Im 2025/12/12 新增Col2Im算子

支持的产品型号

  • Atlas A2训练系列产品
  • Atlas 200I/500 A2推理产品

算子描述

  • 算子功能:列到图像,滑动窗口列向量重组为原始图像。从形状为(N, C ×∏\times \prod(kernel_szie), L)或(C ×∏\times \prod(kernel_szie), L)的列矩阵中重构出形状为(N, C, H, W)或 (C, H, W) 的图像张量,其中L是滑动窗口块的总数。

  • 计算公式: 输入:列矩阵 colcol 形状为 (N,C×kH×kW,L)(N, C \times kH \times kW, L)(C×kH×kW,L)(C \times kH \times kW, L) 输出:图像 outputoutput 形状为 (N,C,H,W)(N, C, H, W)(C,H,W)(C, H, W) 其中:L=out_H×out_W=H+2×padding_val−dilation×(kernel_h−1)−1stride_val+1×W+2×padding_val−dilation×(kernel_w−1)−1stride_val+1L = out\_H \times out\_W = \frac{H + 2 \times padding\_val - dilation \times (kernel\_h - 1) - 1}{stride\_val} + 1 \times \frac{W + 2 \times padding\_val - dilation \times (kernel\_w - 1) - 1}{stride\_val} + 1

  • 原型信息

参数名 输入/输出/属性 描述 数据类型 数据格式
col 输入张量 必选输入张量,形状为(N, C*kH*kW, L)或(C*kH*kW, L) FLOAT、FLOAT16 ND
kernel_h 属性 卷积核的高度,可选属性,默认值为2 INT -
kernel_w 属性 卷积核的宽度,可选属性,默认值为2 INT -
output_h 属性 输出图像的高度,可选属性,默认值为4 INT -
output_w 属性 输出图像的宽度,可选属性,默认值为4 INT -
stride_val 属性 步长,可选属性,默认值为1 INT -
padding_val 属性 填充大小,可选属性,默认值为0 INT -
dilation_val 属性 膨胀系数,可选属性,默认值为1 INT -
x 输出张量 必选输出张量,形状为(N, C, H, W)或(C, H, W) FLOAT、FLOAT16 ND

约束与限制

1. 输入约束

  • 输入张量col的形状:必须为2维或3维
    • 3维格式:[N, CkHkW, L](批处理模式)
    • 2维格式:[CkHkW, L](单样本模式)
    • 其中 N ≥ 1,C ≥ 1,kH ≥ 1,kW ≥ 1,L ≥ 1

2. 参数约束

  • kernel_h:卷积核高度,必须为正整数,默认值为2,满足 1 ≤ kernel_h
  • kernel_w:卷积核宽度,必须为正整数,默认值为2,满足 1 ≤ kernel_w
  • output_h:输出图像高度,必须为正整数,默认值为4
  • output_w:输出图像宽度,必须为正整数,默认值为4
  • stride_val:步长,必须为正整数,默认值为1,stride_val ≥ 1
  • padding_val:填充大小,必须为非负整数,默认值为0,padding_val ≥ 0
  • dilation_val:膨胀系数,必须为正整数,默认值为1,dilation_val ≥ 1

3. 计算约束

  • 输出尺寸计算: 输出图像尺寸为 (output_h, output_w),由属性直接指定

  • 输入维度一致性约束输入第二维度=C×kernel_h×kernel_w输入第二维度 = C \times kernel\_h \times kernel\_w,且必须能被整除

    输入第三维度L=out_H×out_W输入第三维度 L = out\_H \times out\_W

    其中 out_Hout\_Hout_Wout\_W 由以下公式计算:

    out_H=⌊output_h+2×padding_val−dilation_val×(kernel_h−1)−1stride_val+1⌋out\_H = \lfloor \frac{output\_h + 2 \times padding\_val - dilation\_val \times (kernel\_h - 1) - 1}{stride\_val} + 1 \rfloor

    out_W=⌊output_w+2×padding_val−dilation_val×(kernel_w−1)−1stride_val+1⌋out\_W = \lfloor \frac{output\_w + 2 \times padding\_val - dilation\_val \times (kernel\_w - 1) - 1}{stride\_val} + 1 \rfloor

  • 有效卷积核约束kernel_h≤output_h+2×padding_valkernel\_h ≤ output\_h + 2 \times padding\_val kernel_w≤output_w+2×padding_valkernel\_w ≤ output\_w + 2 \times padding\_val

4. 内存约束

  • 输出张量内存大小output_size=N×C×output_h×output_w×element_sizeoutput\_size = N \times C \times output\_h \times output\_w \times element\_size 必须在设备内存限制范围内

5. 数据类型约束

  • 输入张量col和输出张量x的数据类型必须一致
  • 支持的数据类型组合:
    • 输入:FLOAT,输出:FLOAT
    • 输入:FLOAT16,输出:FLOAT16

6. 格式约束

  • 输入和输出张量必须为ND(NCHW)格式
  • 不支持其他数据格式(如NHWC、NC1HWC0等)

7. 特殊情况

  • 当padding_val > 0时:会在输出张量的H和W维度两侧进行对称填充的逆操作
  • 当dilation_val > 1时:卷积核元素之间存在间隔,实际感受野增大
  • 当stride_val > 1时:输出特征图尺寸会相应增大

8. 与Im2Col的关系约束

  • 可逆性:当使用相同的kernel_h、kernel_w、stride_val、padding_val、dilation_val参数,并且output_h、output_w等于原始输入图像尺寸时,Col2Im应该是Im2Col的逆操作

9. 错误条件

  • 如果输入第二维度不能被kernel_h × kernel_w整除,算子应返回错误
  • 如果kernel_h或kernel_w大于填充后的输出尺寸,算子应返回错误
  • 如果计算出的out_H或out_W ≤ 0,算子应返回错误
  • 如果输入第三维度L ≠ out_H × out_W,算子应返回错误
  • 如果输入张量维度不符合要求(非2维或3维),算子应返回错误

算子使用

使用该算子前,请参考社区版CANN开发套件包安装文档完成开发运行环境的部署。

编译部署

  • 进入到仓库目录

    cd ${git_clone_path}/ops-math
    
  • 执行编译

    bash build.sh --experimental --ops=col2_im --soc=ascend910b --pkg
    
  • 部署算子包

    ./build_out/cann-ops-math-custom_linux-aarch64.run
    

算子调用

  • 执行调用

    bash build.sh --run_example col2_im eager cust --vendor_name=custom
    

调用说明

调用方式 调用样例 说明
aclnn调用 test_aclnn_col2_im 通过[aclnnCol2Im]接口方式调用Col2Im算子。