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
相关产品推荐
相关产品推荐

