先说几个关键点:在PyTorch里写多层感知机,用nn.Sequential把线性层和ReLU串起来是最直接的做法,但维度匹配、梯度清零、打印损失这些细节,但凡一个没注意,训练就可能翻车。下面把几个常踩的坑拆开说清楚。

Python神经网络怎么构建_PyTorch定义多层感知机与反向传播

PyTorch里怎么写一个带ReLU和线性层的MLP

nn.Sequential最省事,但得清楚每层输入输出维度必须对得上,否则运行时报RuntimeError: mat1 and mat2 shapes cannot be multiplied。常见错误是忘记把二维输入(比如batch_size × 784)展平,或者在最后一层漏掉nn.Linear导致输出不是标量/类别数。

实操建议:

示例骨架:

model = nn.Sequential(
    nn.Linear(784, 128),
    nn.ReLU(),
    nn.Linear(128, 64),
    nn.ReLU(),
    nn.Linear(64, 10)
)

为什么loss.backward()前要调optimizer.zero_grad()

因为PyTorch默认累积梯度,不手动清零的话,第二次backward()会把新梯度加到旧梯度上,模型乱训——现象是loss不下降、权重爆炸、甚至NaN。这不是bug,是设计如此,但新手几乎必踩。

实操建议:

训练循环里loss.item()loss到底该用哪个

loss是带计算图的Tensor,存着整个反向传播链;loss.item()是Python float,只取当前值。打印、存日志、画图必须用.item(),否则显存越占越多,很快OOM。

实操建议:

反向传播卡住或梯度为零的几个硬检查点

不是所有NaN都来自学习率太大。有些是数据本身带infNaN,有些是激活函数输入超限(比如torch.exp(1000)),还有些是自定义loss写错了求导路径。

实操建议:

复杂点在于:梯度问题往往跨多个环节——数据加载、预处理、模型结构、loss设计、优化器配置,任何一个环节埋雷,都得逐层断点查,没法靠改一行代码解决。

本文转载于:https://www.php.cn/faq/2315518.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。