首页 > 试题广场 >

实现多通道二维卷积

[编程题]实现多通道二维卷积
  • 热度指数:92 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解

实现一个多通道二维卷积。给定输入张量形状、数据、卷积核形状与权重,以及卷积参数 bias/stride/padding/dilation,计算输出并按一行打印,数值保留4位小数(不足补0)。

  • 输入张量形状为 c x y,其中 c 为通道数,x 为行数,y 为列数。随后给出 cxy 个实数,按“通道优先,通道内行优先、行内列优先”顺序给出。
  • 卷积核形状为 out in k k,其中 out 为输出通道数,in 为输入通道数(应与 c 相等),k 为核的高与宽。
  • 卷积权重共 outink*k 个实数,顺序为:先按输出通道 0..out-1,再按输入通道 0..in-1,然后核内按行优先、行内列优先。
  • 参数行给出4个整数:bias stride padding dilation。
    • bias 取 0/1。若为 1,紧随其后再给一行 out 个实数,作为各输出通道的偏置;若为 0,则无该行、偏置默认为 0。
    • stride、padding、dilation 为各向同性整数(高宽一致)。
  • 计算方式:对每个输出通道 oc、输出位置 (oh, ow),有
    out[oc, oh, ow] = Σ_ic Σ_ki Σ_kj input[ic, ih, iw] * weight[oc, ic, ki, kj] + bias[oc]
    其中 ih = ohstride + kidilation - padding,iw = owstride + kjdilation - padding;若 ih/iw 越界,则该项忽略(视为0)。
  • 输出形状为 out × x_out × y_out,其中
    x_out = floor((x + 2padding - dilation(k-1) - 1)/stride + 1)
    y_out 同理。最终按“输出通道优先,再行优先、再列优先”一行打印,元素间以空格分隔,均保留4位小数。

输入描述:
  • 第1行:c x y
  • 第2行:cxy 个实数(通道优先、行优先、列优先)
  • 第3行:out in k k
  • 第4行:outink*k 个实数(权重,顺序见上)
  • 第5行:bias stride padding dilation
  • 若 bias=1:第6行再给 out 个实数(各输出通道的偏置)


输出描述:
  • 一行实数,按规定顺序展开,保留4位小数
示例1

输入

1 3 3
1 2 3 4 5 6 7 8 9
1 1 1 1
2
0 1 0 1

输出

2.0000 4.0000 6.0000 8.0000 10.0000 12.0000 14.0000 16.0000 18.0000

说明

单通道、1×1 卷积核、权重为 2、无偏置,等价于整幅图每个像素乘 2;输出与输入同形状(3×3),按行展开打印。

备注:
本题由牛友@Charles 整理上传
我嘞个豆,这道题真是难到爆了o(╥﹏╥)o
发表于 2025-12-12 16:03:27 回复(0)