在 PyTorch 中构建并训练 CNN
nn.Conv2d、nn.MaxPool2d、nn.Linear、训练循环、优化器、损失,以及准确率跟踪。
在 PyTorch 中构建并训练 CNN 是 CoddyKit 上的免费 Learn AI with Python 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Learn AI with Python 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Learn AI with Python 课程共包含 4 节课。
为什么图像适合使用 CNN?
卷积神经网络能够学习空间模式:先是边缘和纹理,然后是形状与物体。卷积会在整幅图像上共享权重,因此 CNN 高效且能够感知平移,是计算机视觉的基础网络。
import torch
import torch.nn as nnnn.Module 基类
模型继承自 nn.Module。您在 __init__ 中定义层,在 forward 中定义数据流。PyTorch 会自动跟踪参数和梯度。
class CNN(nn.Module):
def __init__(self):
super().__init__()卷积层
nn.Conv2d(in_channels, out_channels, kernel_size) 会在图像上滑动可学习的滤波器,以生成特征图。第一个卷积层接收 3 个通道(RGB),并输出更多通道来捕获不同特征。
self.conv1 = nn.Conv2d(3, 16, kernel_size=3, padding=1)
self.conv2 = nn.Conv2d(16, 32, kernel_size=3, padding=1)池化层
nn.MaxPool2d 会保留每个窗口中的最大值,从而对特征图进行下采样。这样可以缩小空间尺寸、减少计算量,并增加少量平移不变性。
self.pool = nn.MaxPool2d(kernel_size=2, stride=2)全连接层
完成卷积后,将特征展平,并通过 nn.Linear 层生成类别得分。最后一个 Linear 为每个类别输出一个数值。
self.fc1 = nn.Linear(32 * 8 * 8, 128)
self.fc2 = nn.Linear(128, 10) # 10 classesforward 方法
forward 方法定义数据流:卷积、ReLU、池化,重复执行,然后展平并输入线性层。F.relu 添加非线性,使网络能够学习复杂模式。
import torch.nn.functional as F
def forward(self, x):
x = self.pool(F.relu(self.conv1(x)))
x = self.pool(F.relu(self.conv2(x)))
x = x.view(x.size(0), -1) # flatten
x = F.relu(self.fc1(x))
return self.fc2(x)损失与优化器
进行分类时使用 CrossEntropyLoss。像 Adam 这样的优化器会使用梯度更新权重。请传入模型参数和学习率。
model = CNN()
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=1e-3)训练循环:将梯度清零
每个 step 都要先使用 optimizer.zero_grad() 清除旧梯度。如果跳过这一步,梯度就会在批次之间累积,导致更新结果错误。
for images, labels in loader:
optimizer.zero_grad()前向传播与损失
将批次输入模型以获得预测结果,然后计算损失,将预测结果与真实标签进行比较。损失是一个衡量模型错误程度的单一数值。
outputs = model(images)
loss = criterion(outputs, labels)backward 与 step
loss.backward() 通过自动微分计算梯度,optimizer.step() 则调整权重以降低损失。两者合起来构成一个学习 step。
loss.backward()
optimizer.step()跟踪准确率
通过统计正确预测的数量来监控进展。对输出使用 argmax 以获得预测类别,将其与标签进行比较,再用命中数除以总数。
preds = outputs.argmax(dim=1)
correct = (preds == labels).sum().item()
acc = correct / labels.size(0)
print("batch acc:", acc)快速检查
检验您对训练循环的理解。
回顾:构建和训练 CNN
您通过继承 nn.Module 构建了一个 CNN,其中包含 nn.Conv2d、nn.MaxPool2d 和 nn.Linear 层,以及一个 forward 方法。您使用以下循环训练它:zero_grad、前向传播、loss.backward() 和 optimizer.step(),并通过 argmax 跟踪准确率。
常见问题解答
「在 PyTorch 中构建并训练 CNN」课时是免费的吗?
是的 — 「在 PyTorch 中构建并训练 CNN」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Learn AI with Python 课程的其余内容,请升级到 CoddyKit PRO。 Learn AI with Python 课程共包含 4 节课。
「在 PyTorch 中构建并训练 CNN」这节课中我会学到什么?
nn.Conv2d、nn.MaxPool2d、nn.Linear、训练循环、优化器、损失,以及准确率跟踪。 你通过在浏览器中直接运行的动手代码来练习 Learn AI with Python,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Learn AI with Python 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Learn AI with Python 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「在 PyTorch 中构建并训练 CNN」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Learn AI with Python 课中编写并运行代码吗?
能。每节 Learn AI with Python 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- PyTorch 张量与 Autograd
- 自定义数据集与 DataLoaders
- 在 PyTorch 中构建并训练 CNN
- 使用 YOLOv8 进行目标检测