You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python实现2D卷积报错求助:3×4输入与2×2卷积核计算异常

2D卷积代码错误排查与修复

你编写的2D卷积代码输出结果不符,核心问题出在输入矩阵的索引计算错误,以及冗余的边界判断逻辑,下面具体分析并给出修正方案:

错误分析

  • 索引逻辑完全颠倒:代码中I[i-m,j-n]的索引计算完全错误。卷积核在输入矩阵上滑动时,输出位置(m,n)对应的输入区域是从(m,n)起始的k_y×k_x子矩阵,正确索引应为I[m+i, n+j](i为卷积核行索引,j为卷积核列索引)。原代码的反向索引会导致取值完全偏离预期,甚至出现负索引错误。
  • 冗余的边界判断:通过Output_y = I_y - k_y +1和Output_x = I_x -k_x +1已经限制了m、n的范围,m+i和n+j的最大值不会超出输入矩阵的索引边界,因此那个if判断完全多余,反而掩盖了索引错误。
  • 注释语言问题:代码注释为丹麦语,建议改为中文便于后续维护。

修正后的代码

import numpy as np 

def convolution(I, k): 
    # 确保输入矩阵和卷积核都是二维的
    assert(I.ndim == 2)
    assert(k.ndim == 2)

    # 获取输入矩阵和卷积核的尺寸:行、列
    I_rows = I.shape[0]
    I_cols = I.shape[1]
    k_rows = k.shape[0]
    k_cols = k.shape[1]

    # 计算输出矩阵的尺寸
    output_rows = I_rows - k_rows + 1
    output_cols = I_cols - k_cols + 1

    # 创建空的输出矩阵
    Output = np.zeros((output_rows, output_cols))

    # 滑动卷积核计算每个输出值
    for m in range(output_rows): 
        for n in range(output_cols):
            # 遍历卷积核的每个元素,计算点积
            for i in range(k_rows): 
                for j in range(k_cols):
                    Output[m, n] += k[i, j] * I[m + i, n + j]

    return Output

if __name__=="__main__": 
    Input_data = np.array([[2,3,6,9],
                           [1,9,5,1],
                           [4,7,8,5]])

    kernel = np.array([[1,2],
                       [3,1]])
    
    print(convolution(Input_data, kernel)) 

正确输出结果

运行修正后的代码,会得到符合预期的卷积结果:

[[33. 37. 32.]
 [46. 52. 22.]]

内容的提问来源于stack exchange,提问作者Egelund48

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 10:32:12