pytorch中nn.conv2d参数配置关键:in_channels必须匹配输入通道数(灰度填1、rgb填3),out_channels决定特征图数量,kernel_size建议从3起步,padding需配合尺寸公式避免负输出;keras中conv2d推荐padding='same'保尺寸,maxpooling2d用(2,2)步长2最稳妥,损失函数须严格匹配标签格式(如crossentropyloss要raw logits+整数标签)。

直接用 PyTorch 或 Keras 写 CNN 图像分类,比手写卷积运算快得多、稳得多;除非你是在学原理或做课程作业,否则别碰纯 NumPy 实现的卷积层。
PyTorch 中 nn.Conv2d 的参数怎么配才不报错
最常卡在输入通道数、卷积核尺寸和 padding 不匹配。比如你传入 RGB 图像(3 通道),但 in_channels=1,就会报 Expected input channels == 1, but got 3。
-
in_channels必须等于输入张量的第 2 维(NCHW格式下是 C):灰度图填1,RGB 填3,ResNet 中间层可能填64或128 -
out_channels是你想让这一层输出多少个特征图,它决定下一层的in_channels,别设太小(如4),否则后续特征表达能力严重受限 -
kernel_size建议从3开始试,5或7容易导致参数爆炸,且对小图像(如32x32)容易把输出缩到1x1甚至出负尺寸 -
stride默认1,设成2可替代一部分池化层,但要注意输出尺寸公式:H_out = floor((H_in + 2*padding - kernel_size) / stride + 1),算错就RuntimeError: invalid argument
Keras 里 Conv2D 和 MaxPooling2D 怎么串才不崩尺寸
崩尺寸本质是没对齐 padding 模式。Keras 默认 padding='valid'(不补零),输入 32x32,kernel_size=3,输出就是 30x30;再接一层同样配置,就变 28x28……几层下去直接归零。
- 训练小图(MNIST、CIFAR-10)时,无脑加
padding='same',让输出宽高和输入一致,省去手动算尺寸的麻烦 -
MaxPooling2D(pool_size=(2, 2), strides=2)是安全组合,但若前面用了padding='valid',得确认输入尺寸是偶数,否则池化后可能截断 - 别在第一个卷积层前插
Reshape层强行改 shape——Keras 输入层应直接声明input_shape=(28, 28, 1)或(32, 32, 3),维度错一个,后面全错
训练时 loss 不下降,先盯死 torch.nn.CrossEntropyLoss 和 tf.keras.losses.SparseCategoricalCrossentropy
这两个损失函数对标签格式极其敏感,错一点就默默收敛失败,而不是报错。
- PyTorch 的
CrossEntropyLoss要求:模型输出是 raw logits(没过 softmax),标签是长整型tensor([0, 2, 1, ...]),不是 one-hot - Keras 的
SparseCategoricalCrossentropy同样要整数标签;如果用了CategoricalCrossentropy,标签就必须是 one-hot,且模型最后一层必须带softmax - 常见翻车点:用
torch.max(output, 1)[1]取预测类别去算 acc 没问题,但拿这个结果去喂 loss 就完蛋——loss 需要的是原始 output,不是 argmax
真正难调的从来不是“怎么写 CNN”,而是数据加载时 transforms.Normalize 的均值方差填错、验证集混进训练 pipeline、或者 GPU 上张量没 .to(device) 导致 silent fail——这些地方没日志、不报错、只让你怀疑人生。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











