题面概述:给定展开后的输入张量与卷积核及其形状,和分组数 groups,实现分组卷积(包含深度卷积的特例)前向计算。默认 stride=1、padding=0、dilation=1。若形状与 groups 不合法或输出空间维度非正,则输出 −1。
关键条件:
卷积(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 个正整数,依次为
kernel_data: 4 维卷积核展开后的数据序列,以空格分隔的正整数;
kernel_shape: 4 维卷积核的形状,以空格分隔的 4 个正整数,依次为
groups: 分组数,需满足
in_channels%groups=0 ,out_channels%groups=0, k_channels=groupsin_channels
若输入张量和卷积核的形状与 group的取值存在冲突,或出现其它取值冲突导致无法执行卷积计算,则 out_data 和 out_shape 均返回 −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
说明
输入张量为:
[[1324],[5768]]
输入张量形状为1×2×2×2 ;
卷积核为:
[[1001],[−100−1]]
卷积核形状为2×1×2×2 ;
分组数为2 ,输出张量为:
⌈[5],⌈−13]⌉
输出张量形状为1×2×1×1 。
输入
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。