用 ChatGPT 学卷积神经网络时,先拿小矩阵核对一次运算,再讨论复杂模型。这里限定单通道、无 padding、无 dilation、无 bias,用 NumPy 对照输出尺寸和每格数值,避免只背术语却不知道卷积核怎么作用。
把学习问题限定到可手算的例子
将下面提示词发给 ChatGPT,再用自己的手算与本地结果核对回答。下面的代码是独立编写的验证示例,本文没有调用 ChatGPT 账户获得真实回复。

请帮助我学习CNN中的二维卷积层。输入是按行填入1到16的4×4矩阵,
卷积核为[[1,0],[0,-1]],单通道,无padding、dilation=1、bias=0。
按PyTorch Conv2d的互相关约定,不翻转卷积核。
先算stride=1的输出尺寸和左上角数值,再给出完整输出;
随后算stride=2。请说明这次运算与训练一个完整CNN有什么关系。
手算一格,再写 NumPy 验证
左上角取输入 [[1,2],[5,6]],逐元素乘核后求和,得到 1−6=−5。无补边且 dilation=1 时,每个轴的输出尺寸为 floor((输入尺寸−核尺寸)/步长)+1,所以 stride=1 得到 3×3,stride=2 得到 2×2。
python -m pip install numpy
保存为 verify_convolution.py,运行 python verify_convolution.py。本地已在 Python 3.11、NumPy 2.4.6 上运行该矩阵示例;没有训练神经网络,也没有实测 ChatGPT 的回答。
import numpy as np
def conv_valid(image, kernel, stride=1):
height, width = image.shape
kh, kw = kernel.shape
out_h = (height-kh)//stride + 1
out_w = (width-kw)//stride + 1
result = np.zeros((out_h, out_w), dtype=float)
for y in range(out_h):
for x in range(out_w):
patch = image[y*stride:y*stride+kh, x*stride:x*stride+kw]
result[y, x] = np.sum(patch * kernel)
return result
image = np.arange(1, 17, dtype=float).reshape(4, 4)
kernel = np.array([[1., 0.], [0., -1.]])
one = conv_valid(image, kernel, stride=1)
two = conv_valid(image, kernel, stride=2)
assert one.shape == (3, 3) and np.all(one == -5)
assert two.shape == (2, 2) and np.all(two == -5)
print("input", image, "stride1", one, "stride2", two, sep="\n")
哪里算错,就检查哪项约定
本例两个输出矩阵每格均为 −5。若你的 ChatGPT 回答或手算不同,先检查是否翻转核、是否误加 padding、步长是否对应每个滑动窗口;不要只让模型把错误数值重新解释得更顺。
PyTorch Conv2d 文档使用互相关约定。数学课程中严格卷积的核翻转约定可能不同,比较教材或代码时先声明约定,再比较数值。
从一次计算到 CNN 还缺什么
这里的卷积核固定为演示数值。真实 CNN 会学习权重,并通常包含多个输入输出通道、非线性激活和多个层;只做一次固定核计算不能评价训练效果。
下一步先把输入换成另一张 4×4 矩阵,自己核对左上角,再考虑增加 padding 或多个通道。每增加一项先写出输出形状,保持问题能用数值验证。
资料与适用范围
本文依据 2026 年 10 月 1 日读取的项目资料编写。安装后请记录实际依赖版本;版本升级时先用小样本核对接口和输出。
Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/30848.html