#P3493. 第2题-Group卷积实现
-
ID: 2836
Tried: 392
Accepted: 79
Difficulty: 5
所属公司 :
华为
时间 :2025年8月28日-留学生
-
算法标签>模拟
第2题-Group卷积实现
题解
-
题面概述:给定展开后的输入张量与卷积核及其形状,和分组数 groups,实现分组卷积(包含深度卷积的特例)前向计算。默认 stride=1、padding=0、dilation=1。若形状与 groups 不合法或输出空间维度非正,则输出 −1。
-
关键条件:
- inchannels
- outchannels
- kchannels=groupsin_channels
- 输出尺寸:Hout=H−Kh+1,Wout=W−Kw+1,需要 Hout>0,Wout>0
-
深度卷积:是分组卷积的特例,groups=inchannels,kchannels=1,允许 outchannels=groups×depthmultiplier。
题目内容
卷积(Convolution)是计算视觉中常用的计算算子,广泛应用于图像分类、检测、跟踪等多领域。
如下图所示,以 2个三维张量卷积计算为例,取输入张量 为通道数 、高度 、宽度 ,卷积核 为通道数 、高度 、宽度 ,二者执行卷积计算要求其通道数相同。
当取卷积计算步长 ,填充 ,膨胀 ,无偏置项(bias)时,卷积核 在输入张量 上从左至右,从上至下滑动,分别与滑窗所重叠的输入张量 切片,逐元素相乘求和后,得到输出张量 的各元素。
例如:
$y_{0,0}=x_{0,0,0}k_{0,0,0}+x_{0,0,1}k_{0,0,1}+x_{0,1,0}k_{0,1,0}+x_{0,1,1}k_{0,1,1}+x_{1,0,1}k_{1,0,1}+x_{1,1,0}k_{1,1,0}+x_{1,1,1}k_{1,1,1}+x_{2,0,0}k_{2,0,0}+x_{2,1,0}k_{2,1,0}+x_{2,1,1}k_{2,1,1}=72$
面向不同的应用需求,卷积存在多类变种。分组卷积(GroupConvolution)即是随2012年AlexNet提出的一种变种,其将输入张量和卷积核分组后,分别执行卷积计算,然后把多个输出张量进行融合。
例如,输入张量尺寸为 1×32×32×32(其中首个维度1为样本数),卷积核尺寸为4×16×3×3(其中首个维度4 为输出张量通道数,亦可理解为卷积核个数),下图为分组数 时分组卷积计算。
输入张量被切分为1×16×32×32 的两组张量,卷积核被切分为2×16×3×3 的两组张量,分组进行无 padding的卷积计算后,将两组尺寸为1×2×30×30 的计算结果,在第2 个维度拼接,得到尺寸为1×4×30×30 的输出张量。
请不使用PyTorch、MindSpore、PaddlePaddle 等AI 框架,使用编程语言原生库,编写一个支持分组卷积和深度卷积前向传播的函数,根据输入张量、卷积核、分组数,计算输出张量。
输入描述
-
in_data: 4 维输入张量展开后的数据序列,以空格分隔的正整数;
-
in_shape: 4 维输入张量的形状,以空格分隔的 4 个正整数,依次为
- batch size(样本数)
- in_channels(输入张量通道数)
- height(高度)
- width(宽度)
-
kernel_data: 4 维卷积核展开后的数据序列,以空格分隔的正整数;
-
kernel_shape: 4 维卷积核的形状,以空格分隔的 4 个正整数,依次为
- out_channels(输出张量通道数)
- k_channels(卷积核通道数)
- kernel_h(卷积核高度)
- kernel_w(卷积核宽度)
-
groups: 分组数,需满足
in_channels%groups=0 ,out_channels%groups=0, k_channels=groupsin_channels
输出描述
- out_data: 4维输出张量展开后的数据序列,以空格分隔的正整数;
- out_shape: 4 维输出张量的形状,以空格分隔的4个正整数,依次为
- batch_size(样本数)
- out_channels(输出张量通道数)
- height(高度)
- width(宽度)
若输入张量和卷积核的形状与 group的取值存在冲突,或出现其它取值冲突导致无法执行卷积计算,则 out_data 和 out_shape 均返回 −1。
样例1
输入
1 2 3 4 5 6 7 8
1 2 2 2
1 0 0 1 -1 0 0 -1
2 1 2 2
2
输出
5 -13
1 2 1 1
说明
输入张量为:
$\left[\left[\begin{array}{ll} 1 & 2 \\ 3 & 4 \end{array}\right],\left[\begin{array}{ll} 5 & 6 \\ 7 & 8 \end{array}\right]\right]$
输入张量形状为1×2×2×2 ;
卷积核为:
$\left[\left[\begin{array}{ll} 1 & 0 \\ 0 & 1 \end{array}\right],\left[\begin{array}{cc} -1 & 0 \\ 0 & -1 \end{array}\right]\right]$
卷积核形状为2×1×2×2 ;
分组数为2 ,输出张量为:
⌈[5],⌈−13]⌉
输出张量形状为1×2×1×1 。
样例2
输入
1 2 3 4 5 6 7 8 9
1 1 3 3
1 0 0 -1
1 1 2 2
2
输出
-1
-1
说明
解释:
由于inchannels=1、outchannels=1,不满足
in_channels%groups=0 ,out_channels%groups=0,
的条件,因此 out_data 和 out_shape 均返回 -1。